Node.js,为什么ASYNC调用后的行未执行?

时间:2019-10-29 22:20:43

标签: node.js amazon-web-services asynchronous async-await aws-lambda

我正在尝试使用Nodejs编写AWS Lambda函数。

在代码中,我必须调用一个API,等待响应并对该数据进行其他处理(我对此还没有写任何东西) 注意:很抱歉将customerTAX声明为全局,但是我更喜欢让lambda函数可以使用,然后尝试从函数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可以完美地工作,但是我不知道为什么我的lambda函数在这一行中“完成”了,并且在cloudwatch中看不到更多的控制台日志。

希望您的回答非常感谢。

1 个答案:

答案 0 :(得分:0)

对于getCustomerTax()中的入门者,resolve;必须为resolve();

这是一个功能。您需要调用它。

不调用resolve(),则诺言将永远无法解决,因此await getCustomerTax()不会完成,其后的行也不会执行。


仅供参考,request-promise module将自动完成getCustomerTax()中的所有工作(发出http请求,获取响应,处理所有可能的错误并返回表示结果的承诺)。