簡體   English   中英

Node.js無法讀取我的Webhook中的POST JSON數據

[英]Node.js unable to read POST JSON data in my webhook

我有一個node.js + Express應用程序。 它已經提供給第三方服務了。 該服務使用JSON主體向我的Webhook發送POST請求,如下所示:

{“ split_info”:“ null”,“ customerName”:“商家名稱”,“ additionalCharges”:“ null”,“ paymentMode”:“ CC”,“ hash”:“ a31ff1b91fd9b8ae9c82f38b02348d21fsdfd86cc828ac9a0acf82050b3e9a9e9a9e3a3e3b3e3e3b0b3e3b0e3e3b0e3e3b3e0b0e3b0e3b0e0b0e8e3b0e3b0e3b0e8e3e8e3b0e3b0e3b0e3b0b0e8e3b0bf0b使用者,“ paymentId”:“ 551731”,“ productInfo”:“ productInfo”,“ customerEmail”:“ test@gmail.com”,“ customerPhone”:“ 9876543212”,“ merchantTransactionId”:“ jnn”,“ amount”:“ 100.0”,“ udf2”:“ null”,“ notificationId”:“ 4”,“ udf1”:“ null”,“ udf5”:“ null”,“ udf4”:“ null”,“ udf3”:“ null” ,“ error_Message”:“沒有錯誤”}

我正在使用body-parser模塊讀取POST數據。 但是,當我執行req.body時,它給出了[object Object],如果我執行了JSON.stringify(req.body),則它給出了{}即空。 如果我嘗試訪問響應中的鍵,例如req.body.paymentMode,那么它將給出未定義的信息。

這是我的Webhook路由器代碼: 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           

可以肯定的是,我遺漏了一些東西或做錯了什么,但是我無法弄清楚。

謝謝。

我終於發現發生了什么事。

主體解析器的工作方式是,它將僅嘗試解析他們理解Content-Type的請求。 這主要是因為您可以堆疊它們(應用程序使用多種解析器類型而不會發生沖突),並且還因為您通常不希望解析將失敗的請求(內容類型:text / html不太可能通過例如JSON.parse)。

我最終被發送*/*; charset=UTF-8 */*; charset=UTF-8 ,它甚至不是有效的Content-Type標頭值周期。 主體分析器模塊拒絕接受它,因為那是亂碼。 該模塊確實允許您設置一個函數,該函數允許您放置要執行過濾的任何自定義邏輯。

我只需要針對這種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謝謝您的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM