gpt4 book ai didi

amazon-web-services - 从 lambda(节点 js)发布 SNS 消息导致超时错误

转载 作者:行者123 更新时间:2023-12-05 00:47:56 24 4
gpt4 key购买 nike

我使用了一个从 AWS 提供的示例稍微修改的非常简单的代码:

    exports.handler = async (event) => {
// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'ap-southeast-2'});

// Create publish parameters
var params = {
Message: 'This is a sample message',
Subject: 'Test SNS From Lambda',
TopicArn: 'arn:aws:sns:ap-southeast-2:577913011449:TestTopic'
};

// Create promise and SNS service object
var publishTextPromise = new AWS.SNS().publish(params).promise();

let response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};

// Handle promise's fulfilled/rejected states
publishTextPromise.then(
function(data) {
console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
console.log("MessageID is " + data.MessageId);
response.result = 'Success';
}).catch(
function(err) {
console.error(err, err.stack);
response.result = 'Error';
});


return response;
};

我在测试此服务时遇到超时错误。 3 秒是极限。

由于这是一个非常简单的过程,我想它的执行时间应该不会超过 3 秒。

我已检查我的 IAM 设置并授予我的个人资料(管理员个人资料)对 SNS 服务的完全访问权限。但错误仍然存​​在。我想知道这里出了什么问题,我应该如何解决这个问题?

最佳答案

我不确定您为什么会超时,但您的代码不应该按您预期的方式工作。

看到您在 .then() 代码之外返回响应,这意味着您的代码将在 .then() 代码甚至之前返回运行(Promise 是异步的)。

由于您已经在使用 Node 8,因此最好使用 async/await而不是使用旧的 .then().catch() 方法。

我已经稍微重构了您的代码,它运行良好。为了您的方便,我保留了原始参数。看看代码如何更容易阅读和调试。

'use strict';

// Load the AWS SDK for Node.js
const AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'ap-southeast-2'});

const sns = new AWS.SNS()

module.exports.handler = async (event) => {

const params = {
Message: 'This is a sample message',
Subject: 'Test SNS From Lambda',
TopicArn: 'arn:aws:sns:ap-southeast-2:577913011449:TestTopic'
};

let response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};
try {
const data = await sns.publish(params).promise();
response.messageId = data.MessageId,
response.result = 'Success'
} catch (e) {
console.log(e.stack)
response.result = 'Error'
}
return response

};

如果出于某种原因不想使用 async/await,则需要将函数的返回值移到 .then() 代码中,并在调用 promise 时立即返回,如下所示:

'use strict';

// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Set region
AWS.config.update({region: 'ap-southeast-2''});

// Create publish parameters
var params = {
Message: 'This is a sample message',
Subject: 'Test SNS From Lambda',
TopicArn: 'arn:aws:sns:ap-southeast-2:577913011449:TestTopic'
};

module.exports.handler = async (event) => {

// Create promise and SNS service object
var publishTextPromise = new AWS.SNS().publish(params).promise();

let response = {
statusCode: 200,
body: JSON.stringify('Hello from Lambda!'),
};

// Handle promise's fulfilled/rejected states
return publishTextPromise.then(
function(data) {
console.log("Message ${params.Message} send sent to the topic ${params.TopicArn}");
console.log("MessageID is " + data.MessageId);
response.result = 'Success';
return response;
}).catch(
function(err) {
console.error(err, err.stack);
response.result = 'Error';
return response
});

};

我强烈建议您使用方法 #1。

关于amazon-web-services - 从 lambda(节点 js)发布 SNS 消息导致超时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55054301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com