2016-12-15 13 views
0

私はnode.js + Expressアプリケーションを持っています。それは私が第三者のサービスに提供したwebhookを持っています。Node.jsがwebhookのPOST JSONデータを読み取ることができません

{「split_info」:「ヌル」、「CUSTOMERNAME」:「マーチャント名」、 「additionalCharges」:「ヌル」サービスは、次のようになりますJSONボディと私のウェブフックへのPOSTリクエストを送信します、 "paymentMode": "CC"、 "ハッシュ": "a31ff1b91fd9b8ae9c82f38b02348d21fsdfd86cc828ac9a0acf82050996372cc656de3db0fe3bf9af52b73a182a77787241f3e19ec893391607301b03e70db8"、 "状態": "お支払いをリリース"、 "paymentId": "551731"、 "productInfo": "productInfo"、 "customerEmail":」 [email protected] " "customerPhone": "9876543212"、 "merchantTransactionId": "JNN"、 "量" "100.0"、 "udf2": "NULL"、 "通知ID": "4"、" udf1 ":" null "、 " udf5 ":" ヌル」、 "udf4": "ヌル"、 "udf3": "ヌル"、 "ERROR_MESSAGE": "いいえ エラー"}

私はPOSTデータを読み取るためにボディパーサーモジュールを使用しています。しかし、req.bodyを実行すると、[object Object]が与えられます。JSON.stringify(req.body)を実行すると、{}すなわち空になります。 req.body.paymentModeのようなレスポンスのキーにアクセスしようとすると、未定義となります。ここで

はウェブフックのための私のルータのコードです:mywebhook.js

var express = require('express'); 
var router = express.Router(); 

router.post('/success', function(req, res){ 

    //this is where I need to strip the JSON request 
    //req.body or JSON.stringify(req.body) or anything that works 
    //if everything is okay then I send 
    res.sendStatus(200); 

}); 

module.exports = router; 

マイapp.jsは次のようになります。私は何かが足りないか、やって

var express = require('express');        
var exphbs = require('express-handlebars'); 
var router = express.Router();         
var bodyParser = require('body-parser'); 

var mywebhook = require('./routes/mywebhook'); 

var app = express(); 

. 
. 
. 
app.use(bodyParser.urlencoded({'extended':'true'}));   // parse application/x-www-form-urlencoded 
app.use(bodyParser.json());          // parse application/json 
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json 


app.use('/callwebhook', mywebhook); 

. 
. 
. 
so on   

かなり確信して何か間違っていますが、私はそれを理解することができません。

ありがとうございました。

+1

リクエストの 'のContent-type'が'は、アプリケーション/ vnd.api + json'であるあなたは確かにいますか?これは私にとってはむしろ奇妙なようです。 – svens

+0

あなたが正しいのですが、私がhookbin.comを使ってthrid party webhookをテストしたとき、コンテンツの種類は*/*と書かれています。私のapp.jsのコンテンツタイプをapp.use(bodyParser.json({type: '*/*'})))に変更します。 – codeinprogress

+0

私はタイプを '*/*'に変更しましたが、req.bodyはまだ空です。 – codeinprogress

答えて

0

私は最終的に何が起こっていたかが分かりました。

体-パーサが動作する方法は、それが唯一の彼らはコンテンツタイプを理解した要求を解析しようとするということです。これは、主に、それらをスタックすることができます(複数のパーサータイプをapp.useで競合させずに使用できます)。また、通常は失敗するリクエストを解析したくないためです(Content-Type:text/htmlはJSON.parseなど)。

私も有効なのContent-Typeヘッダの値期間ではありません*/*; charset=UTF-8を送っなってしまいました。 body-parserモジュールはそれを受け入れることを拒否しました。このモジュールでは、フィルタリングを実行するカスタムロジックを配置する機能を設定できます。

私はちょうどこのウェブフックケースのための私のルータのコードでボディパーサーを入れていました。

var bodyParser = require('body-parser'); 
var customParser = bodyParser.json({type: function(req) { 
    return req.headers['content-type'] === '*/*; charset=UTF-8'; 
}}); 

router.post('/success', customParser, function(req, res){ 
    console.log(JSON.stringify(req.body)); 
}); 

@svensご協力いただきありがとうございます。

関連する問題