Javascript 节点嵌套函数回调丢失-Lex bot SessionAttribute
我不熟悉节点和异步编程,在学习过程中,我尝试了我能找到的一切,以更好地理解回调。Javascript 节点嵌套函数回调丢失-Lex bot SessionAttribute,javascript,node.js,lambda,callback,Javascript,Node.js,Lambda,Callback,我不熟悉节点和异步编程,在学习过程中,我尝试了我能找到的一切,以更好地理解回调。 这是为了Lex机器人与Facebook的集成,但我想我只是迷失在地狱里了。我的日志显示,所有功能都正常工作,响应是及时构建的,Facebook不会超时,但它确实超时。因此Facebook从未收到响应,因此我相信回调实际上从未到达原始函数 exports.handler = (event, context, callback) => { ... // get user info from Fac
这是为了Lex机器人与Facebook的集成,但我想我只是迷失在地狱里了。我的日志显示,所有功能都正常工作,响应是及时构建的,Facebook不会超时,但它确实超时。因此Facebook从未收到响应,因此我相信回调实际上从未到达原始函数
exports.handler = (event, context, callback) => {
...
// get user info from Facebook
var req = https.get('https://graph.facebook.com/v2.6/'+PSID+'?fields=first_name,last_name,gender&access_token='+pageAccessToken, (res) => {
res.setEncoding('utf8');
res.on('data', function (body) {
console.log("BODY= "+body);
body = JSON.parse(body);
event.sessionAttributes['userInfo'] = {
"first_name": body['first_name'],
"last_name": body['last_name'],
"gender": body['gender'],
"id": body['id']
};
try {
intentProcessor (event, (response) => {
console.log("RESPONSE= "+ JSON.stringify(response));
callback(null, response);
});
} catch (err) {
callback(err);
}
});
});
...
当try
被放置在res.on
之外时,回调会工作并发送响应,但在获取所需的用户数据之前发送响应
当try
放在res.on
中时(如上面的代码所示),响应会与用户信息完美地记录在一起。但它永远不会回到Facebook
有人能解释一下我在处理回叫时出了什么问题吗 请尝试下面的代码
exports.handler = (event, context, callback) => {
let url = `https://graph.facebook.com/v2.6/${PSID}fields=first_name,last_name,gender&access_token=${pageAccessToken}`;
// get user info from Facebook
var req = https.get(url, (res) => {
res.setEncoding('utf8');
res.on('data', function (body) {
body = JSON.parse(body);
event.sessionAttributes['userInfo'] = {
"first_name": body['first_name'],
"last_name": body['last_name'],
"gender": body['gender'],
"id": body['id']
};
intentProcessor(event, (err, response) => {
if (err) {
return callback(err);
}
return callback(null, response);
});
});
});
}如果要使用响应中的数据。你需要“承诺”。在ES7中,async/await是一种很好的处理方法。使用ES7的库或async/await使您的代码工作起来更干净。请看下面的代码
exports.handler = (event, context, callback) => {
let data = getFacebookData();
//Do whatever you want to do using the data.
};
async function getFacebookData(){
let dataFromFacebook=await request('https://graph.facebook.com/v2.6/'+PSID+'?fields=first_name,last_name,gender&access_token='+pageAccessToken);
return JSON.parse(dataFromFacebook);
}
经过长时间的调试,我发现回调和嵌套函数不是问题所在。在嵌套函数的任何级别都可以识别原始回调 真正的问题是Amazon Lex bot不接受
sessionAttributes
中的嵌套对象或数组
Lambda函数中没有出现错误,因此我的日志看起来是干净的。删除
['userInfo']
并将sessionAttributes数据存储为单个对象解决了问题
event.sessionAttributes = {
"first_name": body['first_name'],
"last_name": body['last_name'],
"gender": body['gender'],
"id": body['id']
};
数据
不是传递的全部数据,而是一个数据块。由于其不完整JSON.parse将失败。您可能需要等待结束
事件parsing@JonasW. 谢谢,如果JSON.parse失败,我会注意更改,但它确实正确地解析了信息,并且不会出现我所能说的错误。这会不会是悄无声息地失败并停止回调响应?不会,如果失败,它将崩溃。但是,如果失败,则取决于响应是否小于一个块。因此,你应该明确地在长期内解决这个问题term@SurendaKumarB感谢您尝试回答,但返回回调不会更改结果。仍然没有回应。@jay但是那个intentProcessor
有另一个回调签名,这确实是一件事……谢谢,我忽略了这个答案中的一些编辑。我现在已经完全应用了它,改进了intentProcessor
中的回调。看起来它和我的一样有效。这个回答对我的回调代码的改进很有帮助。尽管回调最终不是问题所在。Lex不接受的是sessionAttributes
中嵌套对象的格式设置。数据
仍然是一个承诺?