【问题标题】:Unable to have AWS lambda wait till asynchronous request call is completed无法让 AWS lambda 等待异步请求调用完成
【发布时间】:2018-11-13 09:14:27
【问题描述】:

在理解 AWS Lambda Node 8.10 中的异步调用时,我遇到了相同/类似的问题。下面是我的代码。它运行,但不是我想要的。我正在尝试获取 HTTPS 标头和相关的 SSL 证书。如果我运行一次 lambda,它会成功运行,但没有数据。如果我一遍又一遍地测试它,返回之一会返回并将 getPeerCertificate 输出到日志中。

这是我挠头的地方...定义了一个回调函数res。我相信正在发生的事情是 lambda 在从 request 调用回调之前消失了。我正在努力使 lambda 保持活动状态以等待请求的返回。我试图使这个尽可能小(没有额外的模块)。有没有可以提供帮助的异步器?

exports.handler = async (event) => {
    console.log(event);
    var https = require('https');

    var options = {
        method: 'HEAD',
        hostname: 'google.com',
        port: 443,
        path: '/'
    };

    try {
        var req = https.request(options, (res) => {
            console.log(res.connection.getPeerCertificate());
        });

        req.end();

    } catch (err) {
        console.error(err);
    }
};

【问题讨论】:

    标签: node.js amazon-web-services async-await aws-lambda


    【解决方案1】:

    您应该像这样使用 lambda 的回调函数:

    const https = require('https');
    
    exports.handler = (event, context, callback) => {
        console.log(event);
    
        const options = {
            method: 'HEAD',
            hostname: 'google.com',
            port: 443,
            path: '/'
        };
    
        const req = https.request(options, (res) => {
            res.on('data', (d) => {
                callback(null, d);
            });
        });
    
        req.on('error', (e) => {
            callback(e);
        });
    
        req.end();
    }
    

    另一种解决方案应该是显式声明一个承诺。

    【讨论】:

    • 为什么是req.end();?那有什么作用?
    • 谢谢大卫。试图使用新的异步构造而不是旧的回调。我正在履行已宣布的承诺。努力学习,学习很多!
    • 您好 Michael,需要req.end(); 才能关闭请求。与.get() 不同,.request() 一直开放到关闭。
    猜你喜欢
    • 2019-10-30
    • 2013-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2019-11-07
    • 2023-03-16
    • 2023-04-08
    相关资源
    最近更新 更多