NodeJS AWS lambda在回调命中之前退出

j2datikz  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(161)

我在早期存在的节点8.10的AWS Lambda中遇到了一个问题,其中包含隐式null返回的回调:

const request = require('request');

exports.handler = async (event, ctx, callback) => {
    console.log(`Fetching '${event.url}'...`);
    request(event.url, (err, body) => {
        if (err) return callback(err);
        return callback(null, body);
    });
}

这是一个基本的例子,说明了我自己的lambda函数中存在的问题。本质上,当我调用第三方资源时,Lambda在回调到达之前就完成了。
我已经阅读了一些文档页面和SO帖子,其中提到:callbackWaitsForEmptyEventLoop,但将其设置为false不会更改行为。
我已经设法通过将代码 Package 在一个承诺中,然后在调用callback之前使用await来迫使它等待响应,但这真的有必要吗?

exports.handler = async (event, ctx, callback) => {
    
    const executeLambda = new Promise((resolve, reject) => {
        console.log(`Fetching '${event.url}'...`);
        request(event.url, (err, body) => {
            if (err) return reject(err);
            return resolve(body);
        });
    });

    await executeLambda
        .then((res) => callback(null, res))
        .catch(callback);
}

注意:我在本地使用docker run --rm -v "$PWD":/var/task lambci/lambda:nodejs8.10 index.handler '{"url": "https://www.google.com"}'模拟这个

gmxoilav

gmxoilav1#

问题是我用async声明了处理程序。

const request = require('request');

exports.handler = (event, ctx, callback) => {
    console.log(`Fetching '${event.url}'...`);
    request(event.url, (err, body) => {
        if (err) return callback(err);
        return callback(null, body);
    });
}

相关问题