程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效?

开发过程中遇到带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效的问题如何解决?下面主要结合日常开发的经验,给出你关于带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效的解决方法建议,希望对你解决带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效有所启发或帮助;

我正在尝试在 AWS Lambda 上创建一个函数,以使用 Twilio API 将 SMS 发送到手机。我使用的是 Node.Js,主要是按照这篇文章中的说明进行操作:https://www.twilio.com/blog/aws-lambda-layers-node-js-twilio-sms

我从那篇文章中得到的发送短信的代码是这样的

exports.handler = (event,context,callBACk) => {

    // Your Account SID from www.twilio.com/console
    // See http://twil.io/secure for important security information
    const accountSID = process.env.account_SID;

    // Your Auth Token from www.twilio.com/console 
    // See http://twil.io/secure for important security information
    const authToken = process.env.AUTH_TOKEN;

    // import Twilio's Node Helper library
    // Create an authenticated Twilio ClIEnt instance
    const clIEnt = require('twilio')(accountSID,authToken);

    // Send a text message
    clIEnt.messages.create({
        body: 'Hello from Lambda!',to: '+12345678901',// your phone number
        from: '+12345678901' // a valID Twilio number
    })
        .then((messagE) => {
            // success,return message SID
            callBACk(null,message.sID);
        })
        .catch((E) => {
                // Error,return error object
            callBACk(Error(E));
        });

};

当我在 AWS 上创建 lambda 时,我选择了一个 Hello-World 模板,它将exports.handler 回调标记为 async,就像这样 exports.handler = async (event,callBACk) => {。我没有注意到这个 async 关键字并从那篇文章中复制粘贴了方法主体,最终将 async/await 代码与 promise 样式 .then 代码混合在一起。我首先在我的计算机上本地测试了这段代码并且它起作用了,因为我只是使用了没有任何顶级函数或任何东西的方法体。但是当我从 AWS Lambda 运行它时,环境变量被正确记录,但之后我没有收到任何其他 O/P 或错误。在浪费了很多时间之后,我决定将链式承诺样式代码更改为 async/await 样式代码并且它起作用了。我修改后的代码是这样的

exports.handler = async (event,callBACk) => {
    // Your Account SID from www.twilio.com/console
    // See http://twil.io/secure for important security information
    const accountSID = process.env.account_SID;

    // Your Auth Token from www.twilio.com/console 
    // See http://twil.io/secure for important security information
    const authToken = process.env.AUTH_TOKEN;

    // import Twilio's Node Helper library
    // Create an authenticated Twilio ClIEnt instance
    const clIEnt = require('twilio')(accountSID,authToken);


    try {
        const messageSID = await clIEnt.messages.create({
                body: 'Hello from Lambda!',// your phone number
            from: '+12345678901' // a valID Twilio number
        });
    }
    catch(err) {
        callBACk(Error(err));
    }
};

我的问题是,将 async/await 与 Promise 类型代码(.then 构造)混合使用是错误的吗?如果我在第一个代码的第一行添加 async 关键字,它就不起作用。为什么会发生这种情况?

解决方法

您不应该将两者结合起来。详细信息可以在这里找到: AWS Lambda function handler in Node.js。

一个关键是:

对于非异步处理程序,函数继续执行,直到事件循环为空或函数超时。在所有事件循环任务完成之前,不会将响应发送给调用者。如果函数超时,则会返回错误。您可以通过将 context.callBACkWaitsForEmptyEventLoop 设置为 false 来配置运行时立即发送响应。

当您不使用 async 时,它将等待事件循环完成。当您使用 async 时它不会这样做,因为它希望您一直使用 async

大佬总结

以上是大佬教程为你收集整理的带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效全部内容,希望文章能够帮你解决带有承诺的 JS 代码不适用于 AWS lambda,但在更改为 async/await 样式时有效所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:lambda