Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js AWS SNS订阅、确认_Javascript_Node.js_Amazon Web Services - Fatal编程技术网

Javascript Node.js AWS SNS订阅、确认

Javascript Node.js AWS SNS订阅、确认,javascript,node.js,amazon-web-services,Javascript,Node.js,Amazon Web Services,我试图将一个SNS主题连接到我的Meteor(node)JS应用程序,但当我尝试订阅和其他东西时,似乎没有得到正确的响应 关于这件事,我没有什么问题。但首先,这是我的主题和代码: 我在SNS中创建了一个主题,它是ARN 我将我的AMI策略设置为 能够使用SNS。拿到我的访问密钥和秘密密钥了吗 在我的本地主机服务器上编写了以下内容: AWS.config.update({ accessKeyId: 'something', secretAccessKey: 'someotherthing

我试图将一个SNS主题连接到我的Meteor(node)JS应用程序,但当我尝试订阅和其他东西时,似乎没有得到正确的响应

关于这件事,我没有什么问题。但首先,这是我的主题和代码:

  • 我在SNS中创建了一个主题,它是ARN
  • 我将我的AMI策略设置为 能够使用SNS。拿到我的访问密钥和秘密密钥了吗
  • 在我的本地主机服务器上编写了以下内容:

    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
    });
    
此时,我仍在本地主机上运行我的节点应用程序

然后我切换到我的AWS SNS面板并创建订阅,选择HTTP作为协议并键入端点URL

第一个问题 我是否有可能在本地主机上使用它,而不将其移动到实时服务器,如果有,如何实现

因此,当我运行应用程序时,控制台会显示以下消息:

{ ResponseMetadata: { RequestId: '64a88abb-7997-5f47-bfcc-d8cfc5281ca3' },
 SubscriptionArn: 'pending confirmation' }
我切换到AWS面板,我看到了


即使我将所有这些数据移动到live server,使用相同的数据,我也会收到这个挂起的消息。我不知道我该怎么办

您需要确认订阅

订阅端点后,Amazon SNS将向端点发送订阅确认消息。您应该已经在端点部署了执行步骤1中描述的操作的代码。具体而言,端点处的代码必须从订阅确认消息中检索SubscribeURL值,并访问SubscribeURL本身指定的位置,或使其对您可用,以便您可以手动访问SubscribeURL,例如,使用web浏览器。亚马逊SNS在确认订阅之前不会向端点发送消息。访问SubscribeURL时,响应将包含一个XML文档,其中包含一个元素SubscriptionArn,该元素指定订阅的ARN。您还可以使用Amazon SNS控制台验证订阅是否已确认:订阅ID将显示订阅的ARN,而不是您首次添加订阅时看到的PendingConfirmation值


您需要确认订阅

订阅端点后,Amazon SNS将向端点发送订阅确认消息。您应该已经在端点部署了执行步骤1中描述的操作的代码。具体而言,端点处的代码必须从订阅确认消息中检索SubscribeURL值,并访问SubscribeURL本身指定的位置,或使其对您可用,以便您可以手动访问SubscribeURL,例如,使用web浏览器。亚马逊SNS在确认订阅之前不会向端点发送消息。访问SubscribeURL时,响应将包含一个XML文档,其中包含一个元素SubscriptionArn,该元素指定订阅的ARN。您还可以使用Amazon SNS控制台验证订阅是否已确认:订阅ID将显示订阅的ARN,而不是您首次添加订阅时看到的PendingConfirmation值


如果您需要确认订阅SNS主题,您可以使用从SNS发送的请求:

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736",
  "Timestamp" : "2012-04-26T20:45:04.751Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEpH+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
要进行确认,您需要正文中标题和标记中的主题图标:

AWS.config.update({
  accessKeyId    : 'ACCESS_KEY',
  secretAccessKey: 'ACCESS_SECRET_KEY',
  region : 'region'
});
// Create S3 Object from AWS SDK
const sns = new AWS.SNS();
// Request options
let options = {
  TopicArn: req.headers['x-amz-sns-topic-arn'],
  Token : req.body.Token
}
// Confirm Token Subscription
sns.confirmSubscription(options, callback);
注意:AWS将向同一端点发送订阅确认和通知,您可以使用标题“x-amz-sns-message-type”区分这些确认和通知


如果需要确认订阅SNS主题,可以使用从SNS发送的请求:

{
  "Type" : "SubscriptionConfirmation",
  "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
  "Token" : "2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736",
  "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
  "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
  "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37fb687f5d51e6e241d09c805a5a57b30d712f794cc5f6a988666d92768dd60a747ba6f3beb71854e285d6ad02428b09ceece29417f1f02d609c582afbacc99c583a916b9981dd2728f4ae6fdb82efd087cc3b7849e05798d2d2785c03b0879594eeac82c01f235d0e717736",
  "Timestamp" : "2012-04-26T20:45:04.751Z",
  "SignatureVersion" : "1",
  "Signature" : "EXAMPLEpH+DcEwjAPg8O9mY8dReBSwksfg2S7WKQcikcNKWLQjwu6A4VbeS0QHVCkhRS7fUQvi2egU3N858fiTDN6bkkOxYDVrY0Ad8L10Hs3zH81mtnPk5uvvolIC1CXGu43obcgFxeL3khZl8IKvO61GWB6jI9b5+gLPoBc1Q=",
  "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
}
要进行确认,您需要正文中标题和标记中的主题图标:

AWS.config.update({
  accessKeyId    : 'ACCESS_KEY',
  secretAccessKey: 'ACCESS_SECRET_KEY',
  region : 'region'
});
// Create S3 Object from AWS SDK
const sns = new AWS.SNS();
// Request options
let options = {
  TopicArn: req.headers['x-amz-sns-topic-arn'],
  Token : req.body.Token
}
// Confirm Token Subscription
sns.confirmSubscription(options, callback);
注意:AWS将向同一端点发送订阅确认和通知,您可以使用标题“x-amz-sns-message-type”区分这些确认和通知


我为typescript创建了一个函数来确认订阅。只需从快车路线通过头部和身体即可

此外,sns请求的内容类型类似于
text/plain
,大多数express应用程序中使用的bodyParser不会处理正文,因此
body.Token
将为空。要解决这个问题,请使用一个中间件,然后再使用body解析器来增加传入的请求

处理订阅确认

从“AWS sdk”导入AWS;
const snsInstance=new AWS.SNS();
函数isConfirmSubscription(标题:{
“x-amz-sns-message-type”:字符串
}) {
返回标题['x-amz-sns-message-type']=='SubscriptionConfirmation'
}
函数确认订阅(
标题:{
“x-amz-sns-topic-arn”:字符串,
“x-amz-sns-message-type”:字符串
},
正文:{Token:string}
):承诺{
返回新承诺(((解决、拒绝)=>{
如果(!isConfirmSubscription(标题)){
返回解析('sns头中没有SubscriptionConfirmation')
}
snsInstance.confirmSubscription({
TopicArn:headers['x-amz-sns-topic-arn'],
代币:身体,代币
},(误差、分辨率)=>{
控制台日志(err);
如果(错误){
退货拒绝(err)
}
返回解析(res.SubscriptionArn);
});
}))
}
订阅确认内容类型修饰符

app.use(函数(请求、恢复、下一步){
if(请求头['x-amz-sns-message-type']){
请求头['content-type']='application/json;字符集=UTF-8';
}
next();
});

我为typescript创建了一个函数来确认订阅。只需从快车路线通过头部和身体即可

此外,sns请求的内容类型类似于
text/plain
,大多数express应用程序中使用的bodyParser不会处理正文,因此
body.Token
将为空。解决