我试图构建一个具有基本客户端-服务器基础设施的应用程序。 服务器基础设施托管在AWS上,当客户端登录时,它会向服务器发送消息,以设置各种基础设施的考虑。 其中一个基础架构是一个SQS队列,客户端可以从这个队列中轮询以获得服务器的更新(最终我想建立一个推送服务,但现在我不知道如何做)。
我正在使用Node AWS SDK在NodeJS中构建这个应用程序。 我遇到的问题是,我需要队列ARN来做各种事情,比如将SQS队列订阅到应用程序使用的SNS主题,但创建队列API返回队列URL,而不是ARN。 因此,我可以使用getQueueAttributes API从URL中获取ARN,但似乎并不奏效。 每当我调用它时,我得到的响应是undefined。 这是我的代码,请告诉我我做错了什么。
exports.handler = (event, context, callback) => {
new aws.SQS({apiVersion: '2012-11-05'}).createQueue({
QueueName: event.userId
}).promise()
)
.then(data => { /* This has the Queue URL */
new aws.SQS({apiVersion: '2012-11-05'}).getQueueAttributes({
QueueUrl: data.QueueUrl,
AttributeNames: ['QueueArn']
}).promise()
})
.then(data => {
console.log(JSON.stringify(data)); /* prints "undefined" */
})
/* Some more code down here that's irrelevant */
}
谢谢!
const AWS = require('aws-sdk');
const sqs = new AWS.SQS();
exports.handler = async(event, context, callback) => {
var params = {
QueueUrl: 'my-queue-url',
AttributeNames: ['QueueArn']
};
let fo = await sqs.getQueueAttributes(params).promise();
console.log(fo);
};
并且它打印了
INFO {
ResponseMetadata: { RequestId: '123456-1234-1234-1234-12345' },
Attributes: {
QueueArn: 'arn:aws:sqs:eu-west-1:12345:my-queue-name'
}
}
在Ersoy的帮助下,我意识到我使用块格式化(用{})来写我的Promise,但我从来没有从这些块中返回任何东西。 我曾以为Promise块中的最后一个值是默认的返回值,但似乎并非如此。 当我在Promise块中添加了 return
SQS API命令前,然后就可以了(不使用asyncawait)。