AWS Node.js Lambda在JavaScript对象中保持异步调用的输出

时间:2018-10-01 14:00:40

标签: node.js aws-lambda

也许这是一个愚蠢的问题,但是我花了很长时间试图解决但无法获取数据。

在下面的函数checkMailCount中,我有一个名为test的对象,其中带有一个函数,用于将值分配给邮件。从res.on('end')分配给此test.mails的值不会通过mailCount保留/持久化。

'use strict';

const https = require('https');

exports.handler = (event, context, callback) => {

    let session = event.session;
    let request = event.request;

    if (request.type === "something") {
        if (request.name === "blah blah") {

            let emailCount = checkMailCount(session, callback);

            context.succeed(callback(null, emailCount));
        }
    }

    function checkMailCount(session, callback) {

        let url = 'https://www.googleapis.com/gmail/v1/users/me/messages? 
        access_token = $ {
            session.user.accesstoken
        } & q = "is:unread"
        ';

        let test = {
            mails: "",
            mailCount: function(val) {
                this.mails = val;
            }
        };

        let data = "";

        https.get(url, function(res) {

            res.on('data', function(chunk) {
                data += chunk;
                //console.log(data);
            });

            res.on('end', function() {
                let result = JSON.parse(data);
                //result2+= result.replace('/\//g','');
                test.mailCount(result["resultSizeEstimate"]);

                // result["resultSizeEstimate"] inaccessible outside
            });

        });


        return test.mails; // This is returning undefined
    }

    //context.fail();
}

以下是来自gmail API的响应JSON

{
 "messages": [
  {
   "id": "165f1627a53f70c6",
   "threadId": "165f000031cee15b"
  },
  {
   "id": "165f00d9e2e07737",
   "threadId": "165f00d9e2e07237"
  }
 ],
 "nextPageToken": "10349401829330188334",
 "resultSizeEstimate": 2
}

我需要从checkMailCount函数返回result [“ resultSizeEstimate”]的值。 result的值result [“ resultSizeEstimate”]在res.on('end',f(){此处可用})内可用,但不在外部。

我不是以lambda的方式在VS代码中尝试此操作,而是可以通过其他方式进行操作。它很难对lambda函数进行单元测试。有没有办法,我可以将电子邮件计数发送到context.succeed(callback(null,emailCount))吗?

1 个答案:

答案 0 :(得分:0)

此代码中的回调似乎存在一个基本问题。 checkMailCount的行为不可能像您希望的那样以其当前形式出现。 checkMailCount是异步的。 JavaScript有几种不同的方式来处理异步代码。最古老的是您在这里做什么,callbacks。接下来是promises,最后是async/await。如果您切换到异步/等待,则此代码可能更容易编写。就是说,如果您想继续使用回调模式,就必须使用它们。

您应该传递自己的lambda回调,而不要传递给checkMailCount

checkMailCount(session, function(err, result) {
    // result === result.resultSizeEstimate
    // Call your lambda callback from within this function
});


res.on('end', function() {
    let result = JSON.parse(data);
    test.mailCount(result["resultSizeEstimate"]);
    callback(null, result.resultSizeEstimate)    
});