Nodejs, почему строки после вызова ASYNC не выполняются? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь написать лямбда-функцию AWS с Nodejs.

Внутри кода я должен вызвать API, дождаться ответа и выполнить другие действия с этими данными (я до сих пор ничего не написалоб этом) ПРИМЕЧАНИЕ: извините за объявление customerTAX глобальным, но я предпочитаю, чтобы лямбда-функция работала с и после, попробуйте вернуть значение из функции isself.

Это код:

'use strict';

var customerTAX;
const https = require('https');
const options = {
      host: 'xxxxxxx.com',
      port: 443,
      path: '/yyyyyyy.json',
      method: 'POST',
      headers: {
        'Content-Type': 'application/graphql',
      }      
};

exports.handler = async (event) => {

        const body = JSON.parse(event.body);
        const orderId = body.id;
        const customerId = body.customer.id; 
        console.log('ORDER ID: ' + orderId);
        console.log('CUST  ID: ' + customerId);
        const query = `xxxxxxxxxxxxxxxxxxxx`;

        //I CAN SEE ALL LOGS OF THIS FUNCTION IN CLOUDWATCH
        await getCustomerTAX(query);  
        //I CAN'T SEE NOTHING BELOW THIS LINE IN AWS CLOUDWATCH

        console.log('CUST TAX: ' + customerTAX);
        if (customerTAX != null) {
            console.log('LETs GO TO SAVE IT')
        } else {
            console.log('NOTAX: No customerTAX');
        }

        const response = {
            statusCode: 200,
            body: JSON.stringify(event.body),
        };          
        return response;
};

var getCustomerTAX = function(query) {
    return new Promise(function(resolve, reject) {
        var req = https.request(options, function(res) {  
            res.setEncoding('utf8');
            var bodyRaw = '';
            res.on('readable', function () {
                var chunk = this.read() || '';
                bodyRaw += chunk;
                console.log('getTAX CHUNK (' + Buffer.byteLength(chunk) + ' bytes): ' + chunk);
            });            
            res.on('end', function () {
                const body = JSON.parse(bodyRaw);
                if (body.TAX.value != null) {
                    customerTAX = body.TAX.value;
                } else {
                    customerTAX = null;
                }     
                console.log("getTAX END: " + customerTAX);
                resolve;
                //console.log('body: ' + Buffer.byteLength(body) + ' bytes');
            });
        });
        //handle the possible errors      
        req.on('error', function(e) {
            console.log("ERROR: " + e);
            reject(e);
        });
        //do the request
        req.write(query);
        //finish the request
        req.end();
    });
};

Функция getCustomerTAX работает отлично, но я не знаю, почему моя лямбда-функция "завершена" в этой строке, и я не вижу больше журналов консоли в cloudwatch.

Надеюсь, вашОтвет и большое спасибо.

1 Ответ

0 голосов
/ 30 октября 2019

Для начала в getCustomerTax(), resolve; должно быть resolve();.

Это функция. Вам нужно позвонить.

Без вызова resolve() обещание никогда не разрешается и, следовательно, await getCustomerTax() никогда не заканчивается и строки после него никогда не выполняются.


К вашему сведению, request-promise module автоматически сделает многое из того, что есть в getCustomerTax() (создайте http-запрос, получите ответ, обработайте все возможные ошибки и верните обещание, представляющее результат).

...