проблема с использованием node.js с модулем node-fetch в async AWS Lambda Function

Вот что я пытаюсь сделать: у меня есть лямбда-функция, запускаемая веб-перехватчиком, который обрабатывает эти данные и использует их для отправки POST-запроса к api.

Я использую Node.js 12 и модуль выборки узлов.

Прямо сейчас функция запускается правильно, но она не отправляет POST при первом вызове. Но если я активирую лямбда-функцию несколько раз за короткий промежуток времени, запросы после первого будут обработаны.

Вот код в файле index.js моей лямбда-функции:

const fetch = require('node-fetch');

exports.handler = async (event) => {

    sendPost();

    const response = {
        statusCode: 200,
        body: "Ok",
    };

    return response;
};


function sendPost() {

    const url = "http://requestbin.net/r/vjv4mvvj";

    const body = {
        foo: "foo",
        bar: "bar",
        baz: "baz"      
    };

    const params = {
        method: "POST",
        mode: "cors",
        headers: {"Content-Type":"application/json"},
        body: JSON.stringify(body)
    };

    fetch(url, params);

}

Когда я удаляю async перед (событие), запрос проходит в первый раз, но сервер, который отправляет веб-перехватчик в первую очередь, не получает ответ.

Так что в основном мне нужно, чтобы POST отправлялся каждый раз при вызове функции, а также мог возвращать код состояния 200.

У меня нет большого опыта работы с async, поэтому я знаю, что это связано с этим, но я ломаю голову.


person benjfriedrich    schedule 29.11.2019    source источник


Ответы (1)


Выборка возвращает обещание, вам нужен await. Также вам нужно отметить функцию sendPost как async. Вам также понадобится функция-обработчик, чтобы дождаться завершения функции sendPost.

const fetch = require('node-fetch');

exports.handler = async (event) => {

    await sendPost();

    const response = {
        statusCode: 200,
        body: "Ok",
    };

    return response;
};


async function sendPost() {

    const url = "http://requestbin.net/r/vjv4mvvj";

    const body = {
        foo: "foo",
        bar: "bar",
        baz: "baz"      
   };

    const params = {
        method: "POST",
        mode: "cors",
        headers: {"Content-Type":"application/json"},
        body: JSON.stringify(body)
    };

    await fetch(url, params);
}
person Arun K    schedule 29.11.2019
comment
Применяя async / await к sendPost (), он неявно возвращает обещание. Было бы более ясно / кратко просто вернуть обещание выборки в конце sendPost () вместо того, чтобы ожидать его в строке. Его ждут в начале обработчика. В любом случае. - person i3ensays; 09.04.2020