2017-12-20 2 views
0

저는 16 시간 동안 자바 스크립트에서 머리카락을 찢어 버리는 데 더 많은 시간을 보냈습니다. 그래서 누군가에게 물어볼 시간이라고 생각했습니다. firebase 함수에서 데이터 읽기

나는 다음과 같이 대략 보이는 중포 기지 데이터베이스에 연결되어 안드로이드 스튜디오에서 안드로이드 응용 프로그램을 가지고 :

nameOfDatabase 
    Places 
     Bar 
      B001 
       place_ID_ : "B001" 
       ... 
       average_rating_ : 0 
       ... 
       number_of_ratings_ : 0 

      ...other bars 

     ...other place types 

    Ratings 
     ratingID1 
      place_ID_ : "B001" 
      rating_ : 3 
      user_ID_ : 4315732985097 

      ...other parameters 

     ...other ratings 

내가 단순히 number_of_ratings_를 업데이트하고 장소 매칭 average_ratings_되고 싶지 rating_이 변경 될 때마다 place_ID_는 기존 값이 수정되거나 새 등급이 추가됩니다. , 반환하기 전에

const functions = require('firebase-functions'); 
const admin = require('firebase-admin'); 
admin.initializeApp(functions.config().firebase); 

exports.UpdateAverageRatings = functions.database.ref('/Ratings/{rating_uid}/rating_').onWrite(event => { 

    let place_ID_ = admin.database().ref('Ratings/' + String(event.params.rating_uid) + '/place_ID_').val(); 

    console.log(place_ID_); 

    let place_type_ = 'BARs'; 
    let place_ID_ = 'B001'; 
    let avg_rating_ = 0; 
    let accumulated_rating_ = 0; 
    let number_of_ratings_ = 0; 

    //Object.keys(place_ID_.parent).forEach(function(key) { 
    // if (place_ID_.parent[key] == 'place_ID_'){ 
    //  accumulated_rating_ += place_ID_.parent[key].value(); 
    //  number_of_ratings_ += 1; 
    //}}); 

    let place_change_ = admin.database().ref('Places/' + String(place_type_) + '/' +String(place_ID_)); 

    place_change_.child('average_rating_').set(avg_rating_); 
    place_change_.child('number_of_ratings_').set(number_of_ratings_); 

    return 0; 

    }); 

마지막 두 줄의 값을, 설정이 정상적으로 작동하지만, 지금은 그냥 더미 값을 설정하고있어 다음 중포 기지 기능 노드 모듈에 대한 나의하는 index.js 코드는 다음과 같습니다 '0'. 올바른 값을 지정하는 아이디어는 나중에 사용하기 위해 주석 처리됩니다.

문제점은 'let place_ID_ ...'행과 그 이후의 콘솔 로그에서 시도한 것처럼 데이터베이스에서 값을 읽지 못하는 것입니다.

나는 문서 (https://firebase.google.com/docs/functions/database-events)와 stackexchange 게시물 수많은 시간을 통해 읽었습니다,하지만 난 하나가

"형식 오류 얻을 :. admin.database를 (...) REF (...) 발입니다. 함수가 아닙니다 "firebase 콘솔 로그에

또는 val()을 제거하면;

W { 
    u: 
    dh { 
    app: 
     FirebaseApp { 
     firebaseInternals_: [Object], 
     services_: [Object], 
     isDeleted_: false, 
     name_: '[DEFAULT]', 
     options_: [Object], 
     database: [Function: bound ], 
     INTERNAL: [Object] }, 
    L: 
     Tb { 
     host: 'projectname.firebaseio.com', 
     domain: 'firebaseio.com', 
     Pc: true, 
     ne: 'projectname', 
     tg: false, 
     ef: '', 
     Za: 'projectname.firebaseio.com' }, 
    Ua: Ff { qc: {} }, 
    Sc: null, 
    ca: he { tb: [] }, 
    td: 1, 
    Qa: 
     kh { 
     id: 0, 
     f: [Function], 
     nd: {}, 
     '$': {}, 
     pa: [], 
     Lc: 0, 
     Hc: [], 
     ma: false, 
     Ra: 1000, 
     qd: 300000, 
     Eb: [Function: bound ], 
     Gc: [Function: bound ], 
     se: [Function: bound ], 
     L: [Object], 
     xe: null, 
     Ab: null, 
     Ea: null, 
     mb: null, 
     Xc: [Object], 
     ae: false, 
     he: 0, 
     Rd: undefined, 
     sb: [Object], 
     Kb: true, 
     Ed: {}, 
     kg: 0, 
     Oe: true, 
     je: null, 
     xc: null }, 
    va: 
     kh { 
     id: 0, 
     f: [Function], 
     nd: {}, 
     '$': {}, 
     pa: [], 
     Lc: 0, 
     Hc: [], 
     ma: false, 
     Ra: 1000, 
     qd: 300000, 
     Eb: [Function: bound ], 
     Gc: [Function: bound ], 
     se: [Function: bound ], 
     L: [Object], 
     xe: null, 
     Ab: null, 
     Ea: null, 
     mb: null, 
     Xc: [Object], 
     ae: false, 
     he: 0, 
     Rd: undefined, 
     sb: [Object], 
     Kb: true, 
     Ed: {}, 
     kg: 0, 
     Oe: true, 
     je: null, 
     xc: null }, 
    qg: Df { qf: {}, Sc: [Object], va: [Object] }, 
    jc: Vc { sd: '', Mc: null, A: [Object] }, 
    fe: Nb { Hd: [Object] }, 
    md: Dg { wa: [Object], hb: [Object], Be: {}, fc: {}, zc: [Object] }, 
    ia: Eb { B: null, k: null }, 
    Xa: ch { ta: [Circular], ba: [Object], INTERNAL: [Object] }, 
    cd: 0, 
    ge: null, 
    K: Dg { wa: [Object], hb: [Object], Be: {}, fc: {}, zc: [Object] } }, 
    path: G { o: [ 'Ratings', 'ratingID1', 'place_ID_' ], Y: 0 }, 
    m: 
    jf { 
    xa: false, 
    ka: false, 
    Ib: false, 
    na: false, 
    Pb: false, 
    oa: 0, 
    kb: '', 
    bc: null, 
    xb: '', 
    Zb: null, 
    vb: '', 
    g: Ae {} }, 
    Kc: false, 
    then: undefined, 
    catch: undefined } 

이 데이터베이스 키는 정수 값만 보유하기 때문에 다소 놀라운 것입니다.

도움을 주시면 대단히 감사하겠습니다. 필요한 경우 자세한 정보를 제공해 드릴 수 있습니다.

편집 지금 비동기를 사용 해봤/기다리고 번과 함께 키워드 (가치) 그 때는 (스냅 샷 => snapshot.val()) 값을 얻을 수 있습니다, 그러나 이것은 컴파일되지 않거나 비동기/대기를 제거하면 약속이 해결되지 않습니다.

답변

2

데이터베이스에서 값을 검색하면 비동기입니다.

var userId = firebase.auth().currentUser.uid; 
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) { 
    var username = (snapshot.val() && snapshot.val().username) || 'Anonymous'; 
    // ... 
}); 

당신은 한 번 얻기를위한 값으로 업데이트를 수신하거나 once('value')에 대한 on('value')를 사용 하나 : 당신이 https://firebase.google.com/docs/database/web/read-and-write 보면

은 한 번 값을 조회하는 예제가 있습니다. 둘 다 snapshot을 전달하는 약속을 반환하고 snapshot.val()은 해당 노드의 값을 제공합니다. 따라서

당신이 그렇게 같은 값을 검색 할 수 있습니다

const place_ID_ = await admin.database().ref(`Ratings/${event.params.rating_uid}/place_ID_`).once('value').then(snapshot => snapshot.val()); 
console.log('place_ID_:', place_ID_); 

잠깐만는, 모든 밑줄 그냥 CamelCase를 시도, 정말 추한 말을) 그리고 당신은 그들이라면 String()에서 변수를 포장 할 필요가 없습니다 이미 문자열이거나 다른 문자열과 연결되어 있습니다. let 대신 변경되지 않는 변수에 const을 사용할 수 있습니다.

+0

만약 내가 await을 사용하면, 전혀 컴파일되지 않을 것이므로 나는 그것없이 시도했다. 이 경우에는 보류중인 약속만으로 끝납니다. 나는 (스냅 샷 => snapshot.val()). 다음 (console.log (스냅 샷)), 그리고 이것은 참조 오류 ("스냅 샷"은 수출에서 정의되지 않습니다)를 제공합니다. – Tachyon

+0

'등급 /'+ 문자열 (event.params.rating_uid) + '/'대신 'Ratings/$ {event.params.rating_uid} /'를 사용하면 데이터베이스가 나중에 작업 한 유일한 부분 인 값을 나중에 업데이트 할 수 없게됩니다 이전에는 이러한 작업이 동등하지 않습니다. – Tachyon

+0

그들은 등가물 es6 문자열을 조회하고 따옴표가 아닌 역 따옴표를 사용하고 있는지 확인하십시오. 부모 함수는'function' 키워드 앞에'async'가 있어야합니다. 또는 firebase의 예와 같이 직접 작업 할 수도 있습니다 –

관련 문제