AWS Lambda Function始终返回null(节点/ Javascript)?

Z_z*_*z_Z 6 amazon-web-services node.js amazon-sns aws-lambda serverless

我有一个简单的Lambda函数,该函数应该获取事件数据并将消息发送到SNS主题。

运行时为Node.js 8.10。

这是我完整的Lambda代码:

const AWS = require("aws-sdk");

exports.handler = async (event) => {

const sns = new AWS.SNS();

const emailBody = 
`
New Message

From: ${event.name}
Contact: ${event.contact}

Message: ${event.message}
`;

const snsMessageParams = {
    TopicArn: process.env.snsTopicArn,
    Message: emailBody
};

sns.publish(snsMessageParams, (err, data) => {
    if(err) {
        return err;
    } else {
        return data;
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

每次我运行该函数时,响应总是总是为null。没有错误返回,但我从未从SNS的电子邮件中收到消息,因此这里有问题。我只是不知道是什么。

我能够从SNS控制台以及本地计算机上的Node SDK成功地将消息发布到我的SNS主题。这些完美地工作。通过直接从成功的本地代码和SNS控制台复制并粘贴,我已检查env变量中的snsTopicArn是否正确。

我在Lambda函数上具有执行角色,该角色应允许我在帐户中的任何主题上发布到SNS。在配置Lambda角色以测试所有内容时,我选择了默认的“ SNSPublish”选项。但是,作为参考,以下是我的执行角色的政策:

{
  "roleName": <MyRoleName>,
  "policies": [
    {
       "document": {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "sns:Publish"
              ],
              "Resource": "arn:aws:sns:*:*:*"
            }
          ]
        }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这是怎么了?任何帮助肯定是感激的。

小智 12

就我而言,我只是尝试执行基本helloWorld处理程序。

exports.helloWorld = (event, context) => {
    context.callbackWaitsForEmptyEventLoop = false;

    return {
        statusCode: 200,
        body: 'Hello World'
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用上述功能,但响应是nullconsole.log工作正常。但添加async到该功能后,显示了正确的响应。

exports.helloWorld = async (event, context) => {
Run Code Online (Sandbox Code Playgroud)


Z_z*_*z_Z 9

好的,我知道了。

有两个问题。首先是我没有使用Lambda隐式使用Node的“ callback”参数。第二个是默认情况下该函数是异步的,因此它期望稍后某个地方“等待”。我决定只删除“异步”并使其同步运行,因为它只是一个简单的函数,无论如何都不需要它。

这是我更新的工作代码:

const AWS = require("aws-sdk");
const sns = new AWS.SNS();

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

const emailBody = 
`
Message

From: ${event.name}
Contact: ${event.contact}

Message: ${event.message}
`;

const snsMessageParams = {
    TopicArn: process.env.snsTopicArn,
    Message: emailBody
};

sns.publish(snsMessageParams, (err, data) => {
    if(err) {
        return err;
    } else {
        callback(null, JSON.stringify(data));
    }
});
};
Run Code Online (Sandbox Code Playgroud)

  • 您也没有使用“err”来调用回调,即它应该是: ```if(err) {callback(err, { statusCode: 500, body: Error: ${err}` }); } else { 回调(null, JSON.stringify(data)); }``` (2认同)
  • 本节的文档:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html (2认同)