Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 尝试使用AWS Lambda和Mailgun发送事务性电子邮件时的奇怪行为_Node.js_Aws Lambda_Mailgun - Fatal编程技术网

Node.js 尝试使用AWS Lambda和Mailgun发送事务性电子邮件时的奇怪行为

Node.js 尝试使用AWS Lambda和Mailgun发送事务性电子邮件时的奇怪行为,node.js,aws-lambda,mailgun,Node.js,Aws Lambda,Mailgun,背景:我一直在使用Lambda函数通过邮枪服务发送事务性电子邮件。我选择使用node.js实现服务器,因为我以前使用过这种语言,但我在服务器端工作的经验不多,所以我一直在努力了解发生了什么 任务:ideia将向多个为此特定邮件注册的收件人发送一封个性化电子邮件,这些收件人只向Lambda功能发出一个请求 问题:为了执行上面解释的任务,我根据Mailgun文档和API参考提出了这个基本实现。我使用了一个forEach,这样我就可以向每个收件人发送一封定制的电子邮件,这正是我所期望的 在本地测试时

背景:我一直在使用Lambda函数通过邮枪服务发送事务性电子邮件。我选择使用node.js实现服务器,因为我以前使用过这种语言,但我在服务器端工作的经验不多,所以我一直在努力了解发生了什么

任务:ideia将向多个为此特定邮件注册的收件人发送一封个性化电子邮件,这些收件人只向Lambda功能发出一个请求

问题:为了执行上面解释的任务,我根据Mailgun文档和API参考提出了这个基本实现。我使用了一个
forEach
,这样我就可以向每个收件人发送一封定制的电子邮件,这正是我所期望的

在本地测试时,一切正常。执行请求并按预期发送电子邮件

然而,在将代码部署到AWS之后,一种奇怪的行为开始出现。当执行请求时,代码的执行似乎在完成之前就停止了,这导致只发送了几封电子邮件。另一件经常发生的事情是,lambda函数的第一次调用不会触发
sendBulkTemplatedEmail
,而是在第一次尝试之后,事情开始进行

CloudWatch上的日志就是这样的:


每一条蓝线都是我使用邮递员执行的请求。出于测试目的,我总是使用3个收件人发送电子邮件。红线表示我添加到代码中的
console.log(body)
。当像{id:'这样的消息没有查看处理程序代码时,我怀疑有两种可能的情况:

  • 处理程序正在使用
    context.callbackhaitsforemptyeventloop=false
    ,这会在调用
    callback
    函数时导致lambda结束
  • 您的处理程序是一个异步处理程序,它不会返回承诺或等待承诺
  • 查看代码段,您也没有正确返回处理程序可以等待的发送电子邮件承诺数组。为此,请将您的
    sendBulkTemplateEmail
    函数更改为:

    const sendBulkTemplateEmail=(配置)=>(组)=>{
    返回组.participants.map((participant)=>{
    //处理您一直在做的代码;
    返回mailgun.messages().send(data)})
    }
    
    }
    当我第一次开始使用JS/lambdas时,我就看到过这样的行为,而且对这两者都是全新的,因此没有正确地实现异步内容。首先,很难说太多,因为上面的代码可能不是完整的lambda,所以我看不出上面的代码是如何使用的。我的怀疑是你没有正确地等待电子邮件的发送,这使得lambda可以在仍然有未解决的承诺时返回并说它已经完成。然后(在req 2中),最终承诺最终解决并被记录,因此,当它不是req 3的一部分时,它似乎是req 3的一部分。