Node.js 如何在nodeJS中获取AWS SQS队列ARN?

Node.js 如何在nodeJS中获取AWS SQS队列ARN?,node.js,aws-sdk,amazon-sqs,aws-sdk-js,aws-sdk-nodejs,Node.js,Aws Sdk,Amazon Sqs,Aws Sdk Js,Aws Sdk Nodejs,我正在尝试使用基本的客户机-服务器基础结构构建一个应用程序。服务器基础设施托管在AWS上,当客户端登录时,它会向服务器发送一条消息,以设置各种基础设施注意事项。基础设施的一部分是一个SQS队列,客户机可以从中轮询以从服务器获取更新(最终我想构建一个推送服务,但我现在不知道如何构建) 我正在NodeJS中使用nodeawsdk构建这个应用程序。我遇到的问题是,我需要队列ARN执行各种操作,比如将SQS队列订阅到应用程序使用的SNS主题,但是创建队列API返回队列URL,而不是ARN。因此,我可以使

我正在尝试使用基本的客户机-服务器基础结构构建一个应用程序。服务器基础设施托管在AWS上,当客户端登录时,它会向服务器发送一条消息,以设置各种基础设施注意事项。基础设施的一部分是一个SQS队列,客户机可以从中轮询以从服务器获取更新(最终我想构建一个推送服务,但我现在不知道如何构建)

我正在NodeJS中使用nodeawsdk构建这个应用程序。我遇到的问题是,我需要队列ARN执行各种操作,比如将SQS队列订阅到应用程序使用的SNS主题,但是创建队列API返回队列URL,而不是ARN。因此,我可以使用getQueueAttributes API从URL获取ARN,但它似乎不起作用。无论何时调用它,我都会得到未定义的响应。这是我的代码,请告诉我我做错了什么:

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);
};
而且是印刷的

{
    ResponseMetadata: { RequestId: '123456-1234-1234-1234-12345' },
    Attributes: {
        QueueArn: 'arn:aws:sqs:eu-west-1:12345:my-queue-name'
    }
}

在Ersoy的帮助下,我意识到我正在使用块格式(带{})来写我的承诺,但我从未从那些块返回任何东西。我原以为Promise块中的最后一个值默认为返回值,但事实似乎并非如此。当我在SQS API命令之前添加
return
时,它工作了(没有使用async/wait)。

您是否尝试了
All
而不是
QueueArn
,它返回了什么?我尝试了'All'、['All']、['QueueArn']和'QueueArn'。所有这些都返回未定义。您是否尝试在现有队列上调用
getQueueAttributes
——我的意思是,如果aws正在异步创建队列,那么即使
createQueue
已完成,您也可能无法将其取回。是的,我尝试创建队列,然后在AWS控制台中注释掉创建队列部分和队列URL中的hardocding。那也没用。顺便说一句,因为这可能是你的下一个问题,我确实尝试过从控制台使用AWS CLI,效果非常好。是:)-这个lambda的执行角色如何-这个lambda的角色是否允许访问SQS?lambda控制台(部分输出):“errorMessage”:“SyntaxError:await仅在异步函数中有效”,请检查>exports.handler=
async
(事件、上下文、回调)=>{当我将等待更改为承诺时。然后()然后它就成功了。我今天花了太多时间在这上面,明天我会尝试扩展它,然后回复你。你是否尝试过用我尝试的方式链接承诺,通过创建队列,然后尝试从中读取?我明天回到这里时会尝试。我没有尝试,只是尝试用当前数据接收它代码。您可以在lambda中使用async/await,这样可以避免回调。AFAIK几乎所有aws sdk库方法都支持async/await.OK,如果我将函数设置为async,然后将我的承诺拆分为async。然后将其链接为一组await调用,那么它就可以工作了。我想了解一下这是为什么(我对NodeJS有点初学者,所以我不懂)。