Как выполнить: ожидание / асинхронность в лямбда-функции node.js? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь создать асинхронную лямбда-функцию, которая делает вызов 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 голосов
/ 31 октября 2019

В соответствии с MDN Web Docs:

Объявление асинхронной функции определяет асинхронную функцию, которая возвращает объект 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();

    });

}
...