【问题标题】:trouble using node.js w/ node-fetch module in async AWS Lambda Function在异步 AWS Lambda 函数中使用带有 node-fetch 模块的 node.js 时遇到问题
【发布时间】:2020-03-24 15:44:57
【问题描述】:

这是我想要做的:我有一个由 webhook 触发的 lambda 函数,该函数将处理该数据并使用它向 api 发出 POST 请求。

我正在使用 Node.js 12 和 node-fetch 模块。

现在该函数被正确触发,但它不会在第一次调用时发送 POST。但是如果我在短时间内重复触发 lambda 函数,第一次之后的请求就会通过。

这是我的 lambda 函数的 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);

}

当我删除 (event) 前面的 async 时,请求第一次通过,但首先发送 webhook 的服务器没有'没有得到回应。

所以基本上我需要在每次调用函数时发送 POST 并且还能够返回 200 状态码。

我没有太多使用异步的经验,所以我知道它与异步有关,但我正在摸不着头脑。

【问题讨论】:

    标签: javascript node.js asynchronous aws-lambda node-fetch


    【解决方案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);
    }
    

    【讨论】:

    • 通过将 async/await 应用于 sendPost() 它隐式地返回一个承诺。在 sendPost() 结束时简单地返回 fetch 的承诺而不是内联等待它会更清晰/简洁。它在 handler.anyway 的开头等待。
    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2013-11-09
    • 2018-11-21
    • 2012-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多