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
中嵌套对象的格式设置。
数据
仍然是一个承诺?