2016-12-15 69 views
0

我有一個node.js + Express應用程序。它有一個我已經提供給第三方服務的webhook。該服務發送POST請求我的網絡掛接與JSON的身體看起來是這樣的:Node.js無法讀取我的webhook中的POST JSON數據

{「split_info」:「空」,「客戶名稱」:「商戶名稱」, 「additionalCharges」:「空」 「paymentMode」: 「CC」, 「哈希」: 「a31ff1b91fd9b8ae9c82f38b02348d21fsdfd86cc828ac9a0acf82050996372cc656de3db0fe3bf9af52b73a182a77787241f3e19ec893391607301b03e70db8」, 「狀態」: 「釋放付款」, 「paymentId」: 「551731」, 「productInfo」: 「productInfo」, 「customerEmail」:」 test123「, 」customerPhone「:」9876543212「,」merchantTransactionId「:」jnn「, 」amount「:」100.0「,」udf2「:」null「,」notificationId「:」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是'application/vnd.api + json'嗎?這對我來說似乎很奇怪。 – svens

+0

你是對的,當我使用hookbin.com測試第三方webhook時,它說內容類型是:*/*。所以我更改我的app.js中的內容類型爲app.use(bodyParser.json({type:'*/*'})); – codeinprogress

+0

好吧,我將類型更改爲'*/*',但req.body仍爲空。 – codeinprogress

回答

0

我終於找到了發生的事情。

body-parser的工作方式是它只會嘗試解析他們理解Content-Type的請求。這主要是因爲你可以堆疊它們(app.use多個解析器類型而沒有衝突),也是因爲你通常不想解析會失敗的請求(Content-Type:text/html不太可能通過例如JSON.parse)。

我最終發送*/*; charset=UTF-8這甚至不是一個有效的Content-Type標題值時段。 body-parser模塊拒絕接受它,因爲這是無用的。這個模塊允許你設置一個函數,讓你可以放置任何你想要執行過濾的自定義邏輯。

我不得不在我的路由器代碼中放置body parser,只是爲了這個webhook的情況。

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謝謝你的幫助。