如何:在Node.js Lambda函数中等待/异步?

时间:2019-10-30 20:37:25

标签: javascript node.js async-await aws-lambda async.js

我正在尝试创建一个异步lambda函数,该函数会进行 http Get 调用,以使其无法正常工作,并且我认为它与异步有关。如果删除 await / async ,并使其同步,则我的功能将正常运行。我不确定自己在做什么错。谢谢您的帮助!

exports.handler = async function (event, context) {

    await setBattery();

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

async function setBattery() {
    'use strict';

    const https = require('https');

    const options = {
        hostname: 'testsite.com',
        port: 443,
        path: '/proxy/api/setting?EM_OperatingMode=1',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
        }
    };

    const req = https.request(options, res => {
        console.log(`statusCode: ${res.statusCode}`);

        res.on('data', d => {
            process.stdout.write(d);
        });
    });

    req.on('error', error => {
        console.error(error);
    });

    req.end();

}

1 个答案:

答案 0 :(得分:0)

根据MDN网络文档:

  

异步函数声明定义了一个异步函数,该函数   返回一个AsyncFunction对象。异步函数是   通过事件循环异步运行的函数,使用    隐式承诺要返回其结果 。但是语法和结构   您使用异步功能的代码更像使用标准   同步功能。

因此,您需要返回一个Promise对象,以便由您的async function处理(您也可以使用另一个诺言来处理它),我将setBattery转换为普通对象函数,并且此函数的返回值现已由您的处理程序(exports.handler)处理。我还没有测试代码,但是应该可以。

exports.handler = async function (event, context) {

    await setBattery();

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

function setBattery() {
    'use strict';

    const https = require('https');

    const options = {
        hostname: 'testsite.com',
        port: 443,
        path: '/proxy/api/setting?EM_OperatingMode=1',
        method: 'GET',
        headers: {
            'Content-Type': 'application/json',
        }
    };

    // Return it as a Promise
    return new Promise((resolve, reject) => {

        const req = https.request(options, res => {
            console.log(`statusCode: ${res.statusCode}`);

            res.on('data', d => {
                process.stdout.write(d);

                // If successful
                resolve(d);
            });
        });

        req.on('error', error => {
            console.error(error);

            // If failed
            reject(error);
        });

        req.end();

    });

}