javascript - Node.js AWS SNS 订阅、确认

标签 javascript node.js amazon-web-services

我正在尝试将 SNS 主题连接到我的 Meteor( Node )JS 应用程序,但当我尝试订阅等内容时,我似乎没有得到正确的响应。

我对此事有几个疑问。但首先,这是我的主题和代码:

  • 我在 SNS 中创建了一个主题,并获取了它的 ARN。
  • 我将 AMI 政策设置为 能够使用SNS。得到了我的访问 key 和 secret key
  • 在我的 LOCALHOST 服务器上写下此内容:

    AWS.config.update({
      accessKeyId: 'something',
      secretAccessKey: 'someotherthing+a4f23',
      region: 'eu-west-1'
    });
    
    let sns = new AWS.SNS();
    
    var params = {
      Protocol: 'http', /* required */
      TopicArn: 'arn:aws:sns:eu-west-1:888472248156:ps-tracking', /* required */
      Endpoint: 'http://URL:4000'
    };
    
    sns.subscribe(params, function(err, data) {
      if (err) console.log(err, err.stack); // an error occurred
      else     console.log(data);           // successful response
    });
    

I'm still running my node app on LOCALHOST at this point

然后我切换到 AWS SNS 面板并创建订阅,选择 HTTP 作为协议(protocol)并输入端点 URL。

第一个问题 我是否有可能让它在本地主机上工作而不将其移动到实时服务器,如果可以的话如何?

所以当我运行应用程序时,我在控制台中收到此消息:

{ ResponseMetadata: { RequestId: '64a88abb-7997-5f47-bfcc-d8cfc5281ca3' },
 SubscriptionArn: 'pending confirmation' }

我切换到我的 AWS 面板,我看到 enter image description here

即使当我使用相同的数据将所有这些移动到实时服务器时,我也会收到此待处理消息。我不知道我应该做什么!

最佳答案

我为 typescript 创建了一个函数来确认订阅。只需从快速路线传入您的 header 和正文即可。

此外,sns 请求的内容类型类似于 text/plain 并且大多数 Express 应用中使用的 bodyParser 不会处理正文,因此 body.Token将是空的。为了解决这个问题,请在正文解析器之前使用中间件来增强传入的请求。

处理订阅确认

import AWS from "aws-sdk";
const snsInstance = new AWS.SNS();

function isConfirmSubscription(headers: {
    'x-amz-sns-message-type': string
}) {
    return headers['x-amz-sns-message-type'] === 'SubscriptionConfirmation'
}

function confirmSubscription(
    headers: {
        'x-amz-sns-topic-arn': string,
        'x-amz-sns-message-type': string
},
    body: {Token: string}
): Promise<string>{

    return new Promise(((resolve, reject) =>{
        if(!isConfirmSubscription(headers)){
            return resolve('No SubscriptionConfirmation in sns headers')
        }

        snsInstance.confirmSubscription({
            TopicArn: headers['x-amz-sns-topic-arn'],
            Token : body.Token
        }, (err, res)=>{
            console.log(err);
            if(err){
                return reject(err)
            }
            return resolve(res.SubscriptionArn);
        });
    }))

}

SubscriptionConfirmation 内容类型修饰符

app.use(function(req, res, next) {
    if (req.headers['x-amz-sns-message-type']) {
        req.headers['content-type'] = 'application/json;charset=UTF-8';
    }
    next();
});

关于javascript - Node.js AWS SNS 订阅、确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47069292/

相关文章:

amazon-web-services - 您应该使用客户端凭据授权类型来验证服务器到服务器吗?

amazon-web-services - AWS EB 从 docker 部署 TypeError

javascript - 可以在不改变布局或 DOM 的情况下使用 jQuery Mobile 吗?

node.js - Node Http 服务器 - 请求收到两次

node.js - Google Cloud Load Balancer 与 Nginx Load Balancer 它们有何不同?

android - 使用安卓账号登录网站

amazon-web-services - 如何从 CF 中的另一个模板检索 secret 管理员名称?

javascript - Google App Script Web App GET 和 POST 请求被 CORS 策略阻止

javascript - 使用td标签中的值字段作为html表中的隐藏字段

javascript - 我正在尝试使用 javascript 中的对象解构打印名字和姓氏,但它为 forEaach 函数提供了错误