AWS nodejs лямбда сохраняет вывод асинхронного вызова в объекте JavaScript - PullRequest
0 голосов
/ 01 октября 2018

Возможно, это глупый вопрос, но я потратил довольно много времени, пытаясь разрешить, но не смог получить данные.

В приведенной ниже функции 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();
}

Ниже приведен ответ JSON от gmail API

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

Мне нужно вернуть значение результата ["resultSizeEstimate"] из функции checkMailCount.Значение result, result ["resultSizeEstimate"] доступно внутри res.on ('end', f () { Здесь доступно }), но не снаружи.

Я пробовал это в коде VS не как лямбда, я мог сделать это другими способами.Это своего рода сложный для модульного тестирования лямбда-функций.Есть ли способ, которым я могу отправить счетчик электронной почты на context.succeed (обратный вызов (null, emailCount))?

1 Ответ

0 голосов
/ 01 октября 2018

Кажется, в этом коде есть фундаментальная проблема с обратными вызовами.checkMailCount не может вести себя так, как вы хотите, в его текущей форме.checkMailCount является асинхронным.В JavaScript есть несколько разных способов работы с асинхронным кодом.Самое старое, что вы здесь делаете, обратные вызовы .Далее обещаний и, наконец, async / await .Этот код, вероятно, легче написать, если вы переключитесь на async / await.Тем не менее, если вы хотите продолжать использовать шаблон обратного вызова, который вам нужно знать, используйте их.

Вместо передачи обратного вызова лямбды на 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)    
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...