19

Expressフレームワークの上に Node.js で PHP アプリを再構築中です。

アプリケーションの一部は、 Amazon SNS 通知が投稿されるコールバック URL です。

SNS からの POST 本文は現在、PHP で次のように読み取られます (動作します)。

$notification = json_decode(file_get_contents('php://input'));

Expressでは、次のことを試しました:

app.post('/notification/url', function(req, res) {
    console.log(req.body);
});

ただし、コンソールを見ると、投稿が行われたときに次のログのみが記録されます。

{}

繰り返しになりますが、Express / Node.js を使用して Amazon SNS の投稿本文にアクセスするにはどうすればよいですか?

4

4 に答える 4

42

もう 1 つの方法は、Content-Typeヘッダーを修正することです。

これを行うためのミドルウェア コードは次のとおりです。

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

これは、ルート プロジェクト ディレクトリにあるutil.jsというファイルがあることを前提としています。

util = require('./util');

app.jsに以下を含めて呼び出します。

app.use(util.overrideContentType());

app.use(express.bodyParser());

app.jsファイルで。これにより、 bodyParser() が本文を適切に解析できるようになります...

邪魔にならず、通常どおりreq.bodyにアクセスできます。

于 2014-04-04T19:19:16.290 に答える
5

これは、AlexGad の回答に基づいています。特に、このコメント:

標準の高速パーサーは、application/json、application/x-www-form-encoded、および multipart/form-data のみを処理します。上記のコードをボディ パーサーの前に追加しました。

app.post('/notification/url', function(req, res) {
    var bodyarr = []
    req.on('data', function(chunk){
      bodyarr.push(chunk);
    })  
    req.on('end', function(){
      console.log( bodyarr.join('') )
    })  
})
于 2013-08-28T19:14:42.770 に答える
4

AWS Node.js SDKを見てみましょう。すべての AWS サービス エンドポイントにアクセスできます。

    var sns = new AWS.SNS();

    // subscribe
    sns.subscribe({topic: "topic", Protocol: "https"}, function (err, data) {
      if (err) {
        console.log(err); // an error occurred
      } else {
        console.log(data); // successful response - the body should be in the data
     }
   });


    // publish example
    sns.publish({topic: "topic", message: "my message"}, function (err, data) {
      if (err) {
        console.log(err); // an error occurred
      } else {
        console.log(data); // successful response - the body should be in the data
     }
   });

編集: 問題は、標準の本文パーサーが、SNS がコンテンツ タイプとして送信するプレーン/テキストを処理しないことです。生のボディを抽出するコードを次に示します。body パーサーの前に配置します。

app.use(function(req, res, next) {
    var d= '';
    req.setEncoding('utf8');
    req.on('d', function(chunk) { 
        d+= chunk;
    });
    req.on('end', function() {
        req.rawBody = d;
        next();
    });
});

その後、次を使用できます。

JSON.stringify(req.rawBody));

ルート内で JavaScript オブジェクトを作成し、SNS 投稿を適切に操作します。

テキスト/プレーンを処理するように本文パーサーを変更することもできますが、ミドルウェアを変更することはお勧めできません。上記のコードを使用するだけです。

于 2013-08-28T13:28:30.900 に答える