Встроенный редактор DialogFlow не может установить ответ через оператор if - PullRequest
0 голосов
/ 17 октября 2018

Я использую DialogFlow для проекта, и одна часть состоит в регистрации пользователей в базе данных, которая работает, как и должно, но я проверяю, существует ли UID в базе данных, и если это так, пользователь долженпредупрежден, но это не работает.Сообщение console.log() передается в базу данных с правильной информацией, но не дает никакого ответа на DialogFlow, в этом случае ответом будет message.

Вот мой код registerUser:

  function registerUser(agent) {

    let added = false;
    let message = "Not used";
    ref.child(uid).once("value", function(snapshot) {
        if (snapshot.val() === null) {
            ref.child(uid).set({
                FIRST_NAME: firstName,
                LAST_NAME: lastName
            });
            added = true;
        }
    }).then(doc => {
        if (added === true) {
            message = "Great! You are now added to the database";
            console.log("User_added_success");
        }
        else {
            message = "User aldready exists!";
            console.log("User_added_fail");
        }
    });
    agent.add(message); 
  }

В качестве ответа выводится "Not used", а console.log () - "user_added_success"

1 Ответ

0 голосов
/ 18 октября 2018

У вас есть пара вопросов, связанных с тем, как вы используете Обещания.Обещания используются базой данных Firebase и облачными функциями Firebase для обработки асинхронных операций в node.js.В современном node.js Promises в значительной степени предпочтительнее обратных вызовов.

Первая проблема заключается в том, что вы, кажется, смешиваете обратные вызовы и Promises, когда обрабатываете ответ на вызов Firebase.Поскольку once() может вернуть Обещание, вам не нужно использовать обратный вызов, но вы можете поместить его как часть .then() блока.Это может выглядеть примерно так:

.once("value").then( snapshot => {
    if (snapshot.val() === null) {
        ref.child(uid).set({
            FIRST_NAME: firstName,
            LAST_NAME: lastName
        });
        added = true;
    }
    return snapshot;
})

Вторая проблема заключается в том, что все, что установлено посредством выполнения Обещания, должно быть прочитано в более поздней части цепочки Обещания.Так же, как вы устанавливаете added в первой функции then() и читаете ее во второй, если вы устанавливаете message во второй, вам нужно обрабатывать это либо в этом предложении then(), либо впозже then() пункт.Поскольку других асинхронных операций не происходит, вы можете просто сделать это после предложения if / else.Возможно, что-то вроде этого:

    if (added === true) {
        message = "Great! You are now added to the database";
        console.log("User_added_success");
    }
    else {
        message = "User aldready exists!";
        console.log("User_added_fail");
    }
    agent.add( message );

Однако есть еще одна проблема, связанная с Обещаниями.Если вы используете асинхронные вызовы (и, следовательно, Promises), вы также должны вернуть Promise из вашего Intent Handler, чтобы библиотека Dialogflow могла ожидать результатов, прежде чем отправит сообщение обратно пользователю.Не ясно, является ли это самим обработчиком, но если так, самый простой способ справиться с этим - вернуть результаты цепочки Promise.Поскольку вызов базы данных Firebase возвращает Promise, эта часть может быть простой:

return ref.child(uid)

(за которой следуют методы .once() и .then(), описанные выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...