我有一个小型聊天机器人,它对“测试”一词有反应。阅读此词后,他应该调用IBM Cloud Function,该IBM Cloud Function会尝试注册返回令牌的用户。问题在于,认证API大约需要30秒钟才能响应,并且IBM Cloud函数立即执行。所以我的反应总是这样
{
"body": {},
"headers": {"Content-Type": "application/json" },
"status": 200
}
But it should actually return the token in the body
{
"body": { "token": ... },
...
}
我已经尝试将超时设置为5分钟,但这没有帮助。我在Postman中也尝试过,在那里我得到了正确的答复。然后,我导出了对javascript的请求,并对其进行了修改,使其可以在Cloud Function中运行,但再次返回了空的正文。
var request = require("request");
function main({id=123}) {
var options = { method: 'POST',
url: 'ip:port/v1/authentication',
headers:
{
"Host": "ip:port",
"Content-Type": "application/json" },
body: { username: '---', password: '---' },
json: true };
var result = { error: "No result was received" };
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(`Response body is: ${response.body}`);
result = { token: response.body.token };
});
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: { token: result["token"] }
};
}
在下面,您可以看到我收到的消息
Activation ID:
...
Results:
{
"body": {},
"headers": {
"Content-Type": "application/json"
},
"statusCode": 200
}
Logs:
[]
遗憾的是,由于一切都在逻辑上正常进行,因此日志未显示任何错误消息。
答案 0 :(得分:1)
调用Cloud Function或Webhook has a limit of 5 seconds时往返的总时间。这是由Watson Assistant强加的,因此更改Cloud Functions中的任何超时都无济于事。
您可以优化流程(为什么花那么长时间?)或将其分为两个动作。第一个呼叫将启动身份验证,第二个呼叫将检查是否成功。有一个对话框选项,告诉用户正在发生某些事情,而无需等待用户输入(skip user input)。用它来桥接用户认证之前的时间。
答案 1 :(得分:1)
这是一个菜鸟Node.js错误。
request
是一个异步调用。身体
if (error) throw new Error(error);
console.log(`Response body is: ${response.body}`);
result = { token: response.body.token };
在请求完成时执行。返回
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: { token: result["token"] }
};
应该在这个身体旁边。您所拥有的位置将在令牌请求完成之前立即返回没有令牌的位置。
因此您的代码应为-
request(options, function (error, response, body) {
if (error) {
return {
statusCode: 500,
body: { error: error }
};
}
console.log(`Response body is: ${response.body}`);
result = { token: response.body.token };
return {
statusCode: 200,
headers: { "Content-Type": "application/json" },
body: { token: result["token"] }
};
});