gpt4 book ai didi

node.js - Dialogflow - 使用异步/等待从数据库读取

转载 作者:太空宇宙 更新时间:2023-11-03 23:15:07 24 4
gpt4 key购买 nike

这是我第一次使用 async/await。我在对话流意图内的数据库请求上下文中使用它时遇到问题。如何修复我的代码?

会发生什么?

当我尝试运行使用我的后端时 - 这就是我得到的结果:“Webhook 调用失败。错误:请求超时。”

我怀疑什么?

我的辅助函数 getTextResponse() 等待 Airtable 的返回值,但从未得到它。

我想做什么?

  1. “GetDatabaseField-Intent”被触发
  2. 在内部通过 getTextResponse() 向我的 Airtable 数据库发送请求
  3. 因为我使用“await”,该函数将在继续之前等待结果
  4. getTextResponse() 将返回“returnData”;因此 var 结果将填充“returnData”
  5. 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);

最佳答案

正如 @Kolban 指出的,您没有接受或拒绝在 getTextResponse() 中创建的 Promise。

看起来 var result = wait getTextResponse(...) 调用也不正确。您已定义 getTextResponse() 来接受两个参数,但您要向其传递三个参数(前两个,加上匿名箭头函数)。但这个额外的函数从未被使用/引用。

我通常会避免将显式 promise 与 async/await 混合在一起,并且绝对避免将 async/await 与传递回调混合在一起。

我不知道您正在使用的 API 的详细信息,但如果该 API 已经支持 Promise,那么您应该能够执行以下操作:

const getTextResponse = async (mySheet, myRecord) => {
try {
return await base(mySheet).find(myRecord)
}
catch(err) {
console.error(err);
return;
}
)};

...

app.intent('GetDatabaseField-Intent', async (conv) => {
const sheetTrans = "NameOfSheet";
const recordFirst = "ID_OF_RECORD";

var result = await getTextResponse(sheetTrans, recordFirst)
myResponse = result.fields.en;
conv.ask(myResponse);
});

...

几乎所有基于 Promise 的库或 API 都可以与 async/await 一起使用,因为它们只是在底层使用 Promises。 await 之后的所有内容都会成为回调,当等待的方法成功解析时会调用该回调。任何不成功的解决方案都会引发 PromiseRejected 错误,您可以使用 try/catch block 来处理该错误。

关于node.js - Dialogflow - 使用异步/等待从数据库读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56433531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com