具有异步数据库读取功能的 DialogFlow Firebase Cloud Function
DialogFlow Firebase Cloud Function with async database read
我正在使用 Firebase Cloud Function 作为我的 DialogFlow Google Assistant Action 的实现,但我需要在管理意图之前从 Firebase 数据库中检索数据。这是一个代码片段:
var userDataRef = sessionDatabaseRef.child(sessionId);
userDataRef.once("value").then(function(data) {
console.log(data.val());
handleIntentAndProcessResponse();
}).catch(function(){
console.log("No data yet for this session");
handleIntentAndProcessResponse();
});
名为 handleIntentAndProcessResponse
的函数是意图逻辑 returns 通过设置 conv.ask(new SimpleResponse(blah))
内容进行响应的地方。当我测试它时它失败了并且 Cloud Function 日志给我这个错误:
Error: No response has been set. Is this being used in an async call that was not returned as a promise to the intent handler?
那么,我该如何处理对 Firebase 数据库的异步调用,以便它等待响应?当我处理意图时,我需要使用它 returns 的数据。
如错误消息所示,您需要 return Promise 本身,以便调度程序知道它需要等待异步操作的每个部分完成。
幸运的是,对 userDataRef.once().then().catch()
的调用将评估为一个 Promise,您只需 return 即可。所以这应该不错
return userDataRef.once("value").then(function(data) {
console.log(data.val());
handleIntentAndProcessResponse();
}).catch(function(){
console.log("No data yet for this session");
handleIntentAndProcessResponse();
});
我正在使用 Firebase Cloud Function 作为我的 DialogFlow Google Assistant Action 的实现,但我需要在管理意图之前从 Firebase 数据库中检索数据。这是一个代码片段:
var userDataRef = sessionDatabaseRef.child(sessionId);
userDataRef.once("value").then(function(data) {
console.log(data.val());
handleIntentAndProcessResponse();
}).catch(function(){
console.log("No data yet for this session");
handleIntentAndProcessResponse();
});
名为 handleIntentAndProcessResponse
的函数是意图逻辑 returns 通过设置 conv.ask(new SimpleResponse(blah))
内容进行响应的地方。当我测试它时它失败了并且 Cloud Function 日志给我这个错误:
Error: No response has been set. Is this being used in an async call that was not returned as a promise to the intent handler?
那么,我该如何处理对 Firebase 数据库的异步调用,以便它等待响应?当我处理意图时,我需要使用它 returns 的数据。
如错误消息所示,您需要 return Promise 本身,以便调度程序知道它需要等待异步操作的每个部分完成。
幸运的是,对 userDataRef.once().then().catch()
的调用将评估为一个 Promise,您只需 return 即可。所以这应该不错
return userDataRef.once("value").then(function(data) {
console.log(data.val());
handleIntentAndProcessResponse();
}).catch(function(){
console.log("No data yet for this session");
handleIntentAndProcessResponse();
});