【问题标题】:AWS nodejs lambda persist output of asynchronous call in JavaScript objectAWS nodejs lambda在JavaScript对象中持久化异步调用的输出
【发布时间】:2018-10-01 14:00:40
【问题描述】:

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

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

'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(){It is available here}) 内部可用,但在外部不可用。

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

【问题讨论】:

标签: node.js aws-lambda


【解决方案1】:

此代码中的回调似乎存在根本问题。 checkMailCount 不可能以当前形式表现得像您希望的那样。 checkMailCount 是异步的。 JavaScript 有几种不同的方式来处理异步代码。最古老的是你在这里做的,callbacks。接下来是promises,最后是async/await。如果切换到 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)    
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-13
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多