在Google V1上的“操作”中,我可以使用Webhook轻松地在api之间来回解析信息
但是V2具有不同的方法,它跳过了request()
函数,只处理了conv.tell / conv.ask。
V1代码:
function helpIntent (app) {
request(API_URL, { json: true }, function (error, response, body) {
console.log("nameIntent Response: " + JSON.stringify(response) + " | Body: " + body + " | Error: " + error);
var msg = body.response;
app.tell(msg);
});
}
V2代码:
app.intent('help', (conv) => {
request(API_URL, { json: true }, function (error, response, body) {
console.log("nameIntent Response: " + JSON.stringify(response) + " | Body: " + body + " | Error: " + error);
var msg = body.response;
conv.close(msg);
})
});
那么如何使conv.close(msg)
在V2 code
中正确调用了?
答案 0 :(得分:2)
问题在于request
是异步操作。使用最新版本的Google动作库,如果处理程序中有异步调用,则必须返回Promise。否则,当处理程序结束时,异步函数仍将处于挂起状态,并且触发处理程序的代码不知道这一点,因此它将立即返回响应。
最简单的方法是使用request-promise-native
软件包而不是request
软件包。这可能会使您的代码看起来像这样:
app.intent('help', (conv) => {
var rp = require('request-promise-native');
var options = {
uri: API_URL,
json: true // Automatically parses the JSON string in the response
};
return rp(options)
.then( response => {
// The response will be a JSON object already. Do whatever with it.
console.log( 'response:', JSON.stringify(response,null,1) );
var value = response.msg;
return conv.close( value );
});
};