这是我第一次使用 async/await。我在对话流意图内的数据库请求上下文中使用它时遇到问题。如何修复我的代码?
怎么了?
当我尝试使用我的后端运行时 - 这是我得到的:“Webhook 调用失败。错误:请求超时。”
我怀疑什么?
我的辅助函数 getTextResponse() 等待 airtable 的返回值,但永远不会得到它。
我想做什么?
- “GetDatabaseField-Intent”被触发
- 在里面它通过 getTextResponse() 向我的 airtable 数据库发送一个请求
- 因为我使用“await”,所以函数会在继续之前等待结果
- getTextResponse() 将返回“returnData”;所以 var 结果将用“returnData”填充
- getTextResponse() 已完成;因此将使用它的返回值创建响应
'use strict';
const {
dialogflow
} = require('actions-on-google');
const functions = require('firebase-functions');
const app = dialogflow({debug: true});
const Airtable = require('airtable');
const base = new Airtable({apiKey: 'MyKey'}).base('MyBaseID');
///////////////////////////////
/// Helper function - reading Airtable fields.
const getTextResponse = (mySheet, myRecord) => {
return new Promise((resolve, reject) => {
// Function for airtable
base(mySheet).find(myRecord, (err, returnData) => {
if (err) {
console.error(err);
return;
}
return returnData;
});
}
)};
// Handle the Dialogflow intent.
app.intent('GetDatabaseField-Intent', async (conv) => {
const sheetTrans = "NameOfSheet";
const recordFirst = "ID_OF_RECORD";
var result = await getTextResponse(sheetTrans, recordFirst, (callback) => {
// parse the record => here in the callback
myResponse = callback.fields.en;
});
conv.ask(myResponse);
});
// Set the DialogflowApp object to handle the HTTPS POST request.
exports.dialogflowFirebaseFulfillment = functions.https.onRequest(app);