Облачная функция Node.js "firestore set () внутри get (), если не существует" не работает правильно? - PullRequest
0 голосов
/ 27 сентября 2018

Вот я пытаюсь добиться

if user is exist in firestore 
      show the data 
else
      add it to firestore

И вот мой код

// See https://github.com/dialogflow/dialogflow-fulfillment-nodejs
// for Dialogflow fulfillment library docs, samples, and to report issues
'use strict';
const functions = require('firebase-functions');
const {WebhookClient} = require('dialogflow-fulfillment');
const admin = require('firebase-admin');
admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

var db = admin.firestore();
const settings = {timestampsInSnapshots: true};
db.settings(settings);

exports.dialogflowFirebaseFulfillment = functions.https.onRequest((request, response) => {
    const agent = new WebhookClient({ request, response });

    function save(agent) {
        const usersRef = db.collection('users').doc('someid');
        usersRef.get().then(function(doc) {
            if(doc.exists) {
                let existingUser = doc.data();
                console.log("Document is already exists " + existingUser.userName);
                agent.add('Hello ');
            } else {
                console.log("Document creation is started");
                usersRef.set({
                    userName : 'somename'
                });
                agent.add('Welcome ');
            }
        }).catch(function(error) {
            console.error("Error writing document: ", error);
            agent.add('Failed to login!');
        });
    }
    let intentMap = new Map();
    intentMap.set('dialogflow-intent-name',save);
    agent.handleRequest(intentMap);
});

Но выполнение вышеприведенного кода запускает облачную функцию и сначала прерывается, и мой чат-бот не получает никакого ответа, но после журнала выполнения выглядит как

  • Выполнение функции началось
  • Выполнение функции заняло 404 мс, завершено с кодом состояния: 200
  • "Документ уже существует someusername "

1 Ответ

0 голосов
/ 27 сентября 2018

DocumentReference.set возвращает обещание, и вы не дожидаетесь его завершения.Так что это должно работать, если вы измените свой код с:

usersRef.set({
    userName : 'somename'
});
... rest of the code

на

usersRef.set({
    userName : 'somename'
}).then(result => {
    ... rest of the code
})
...