我正在尝试为Google Assistant建立一个后端Webhook,以从DynamoDB中读取记录。
这是我的代码:
// Handle the Dialogflow intent named 'trip name'.
// The intent collects a parameter named 'tripName'.
app.intent('trip name', (conv, {tripName}) => {
const dynamoDb = IS_OFFLINE === true ?
new AWS.DynamoDB.DocumentClient({
region: 'ap-south-1',
// endpoint: 'http://127.0.0.1:8080',
}) :
new AWS.DynamoDB.DocumentClient({
region: 'ap-south-1',
// endpoint: 'http://127.0.0.1:8080',
});
const params = {
TableName: ACTIVITIES_TABLE
Key: {
'name':tripName
}
};
// conv.close('error retrieving!'); THIS WORKS
dynamoDb.get(params, (error, result) => {
// conv.close('error retrieving!'); THIS DOES NOT
if (error) {
conv.close('error retrieving!');
}
else {
conv.close(JSON.stringify(result, null, 2));
}
});
});
如果我要从DynamoDB函数外部使用conv
,则可以使用,但是从内部不能使用,并且返回此错误:
2019-08-03T03:56:22.521Z **错误错误:未设置响应。这是在异步调用中使用的吗 没有作为对意图处理程序的承诺返回?
我得出的结论是,也许不允许我从另一个嵌套的箭头函数访问箭头函数自变量?
答案 0 :(得分:2)
问题与从另一个箭头功能访问参数无关-完全允许。
问题是,如错误消息所提示,您正在使用异步函数(该函数需要callback0,但不返回Promise
对象。Google行动库要求您返回如果您正在执行任何异步操作,请从您的Intent Handler中获取一个Promise
,以便它知道等待这些操作完成。
您需要从呼叫中使用回调到dynamoDb.get()
切换为使用Promise
。为此,您不需要包括回调函数,因此get()
返回一个AWS.Request
对象。该对象具有promise()
方法,因此您可以使用此方法从Promise and then() chain返回结果。 (并且您必须返回此Promise
。)
在您的情况下,可能看起来像这样
return dynamoDb.get(params).promise()
.then( result => {
conv.close(JSON.stringify(result, null, 2));
})
.catch( error => {
conv.close('error retrieving!');
});