node.js - ExpressJS 在 POST 请求中显示空的 req.body 对象,但不包括 Insomnia 或 cURL
问题描述
我正在尝试在我的 MERN 网站中加入一个全球支付网关(GPG 结账)。
付款过程完成后,GPG 服务器应该使用 cURL 向我发送一个 post 请求到我在 GPG 仪表板中设置的路由。这个post请求的内容是:PayAmount, PAYID, TransStatus, Signature。
这是我的路线:
router.route('/confirm-payment-detailes').post(async (req,res)=>{
//const {TotalAmount,PAYID,TransStatus,Signature} = req.body;
//console.log({TotalAmount,PAYID,TransStatus,Signature});
// show any post request content to this route
console.log(req.body)
});
我正在显示我在该路线上获得的所有 POST 字段。
当我在笔记本电脑上使用 insomnia 或 cURL 进行测试时,它显示了我在服务器日志中发送的数据,但是当我完成付款过程时它显示空对象(这意味着 GPG 结帐服务器知道我的通知 URL 并发送一个POST 请求,但它仍然显示为空)。
我打电话给支持团队,他们给我发了一个通知页面的 PHP 示例:
<?php
$url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$url = $_SERVER['REQUEST_URI'];
$my_url = explode('wp-content' , $url);
$path = $_SERVER['DOCUMENT_ROOT']."/".$my_url[0];
$PayAmount = $_POST['TotalAmount'];
$PAYID = $_POST['PAYID'];
$TransStatus = $_POST['TransStatus'];
$Signature = $_POST['Signature'];
include_once $path . '/wp-config.php';
include_once $path . '/wp-includes/wp-db.php';
include_once $path . '/wp-includes/pluggable.php';
$sign = sha1( $_POST['TransStatus']. $PAYID . "XXXXXXX" );
if($Signature == $sign){
$order = wc_get_order( $PAYID );
switch ( $TransStatus ) {
case '05' : // refus
$order->update_status( 'wc-failed', $reason );
break;
case '00' : // accord
$order->update_status( 'wc-processing', $reason );
WC()->cart->empty_cart();
break;
case '06' : //annuler
$order->update_status( 'wc-cancelled', $reason );
break;
case '07' : // rembourser
$order->update_status( 'wc-refunded', $reason );
break;
case '08' : // Charge back
default :
break;
}
}
?>
据我所知,这只是一个简单的 POST 请求!为什么我的服务器显示空对象?虽然当我用随机字段测试失眠或卷曲时它工作正常。
这是我的 app.js 文件内容:
//imports Here :
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const mongoStore = require('connect-mongo');
//declare app here :
const app = express();
app.disable('x-powered-by');
app.set('view engine','ejs');
app.set('views','Views');
app.use(express.static(__dirname + '/Public'));
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({extended:false}));
app.use(cors());
//Clients API Routes :
app.use(process.env.CLIENT_API_PATH,require('./Routes/clientAPIRoutes'));
//Admin Pages Routes :
app.use(process.env.ADMIN_PATH,require('./Routes/adminPageRoutes'));
module.exports = app;
有人对这个问题有任何想法吗?
编辑: 我确实在我的服务器上创建了一个 php 文件来接收数据而不是节点应用程序,并且它确实通过使用 $_POST["field_name"] 来工作,所以我真的很困惑!
解决方案
在从您的 php 脚本发送请求时设置您的内容类型标头。这里 CURL ( curl 可能会给你输出但格式错误),邮递员默认为你做。这里服务器需要知道您在请求中发送的数据类型,因此它可以使用适当的方法来获取该编码数据。即 json、xml、x-www-form-urlencoded 和 multipart 等
这可以通过在请求中设置Content-Type标头来完成
像这样设置Content-Type : application/json(for json data) or xml (for xml data) or x-www-form-urlencoded
$_POST使用 application/x-www-form-urlencoded 或 multipart/form-data 作为请求中的 HTTP Content-Type。通过包含此内容在您的 PHP 脚本中运行检查,echo $_SERVER["CONTENT_TYPE"];
并且可能的输出可能multipart/form-data
基于application/x-www-form-urlencoded
已经在您的节点服务器中解析。用于解析multipart/form-data
安装 npm multer 中间件包npm install multer
。
//imports Here :
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const mongoStore = require('connect-mongo');
const multer= require('multer');
//declare app here :
const app = express();
app.disable('x-powered-by');
app.set('view engine','ejs');
app.set('views','Views');
app.use(express.static(__dirname + '/Public'));
app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({extended:false}));
app.use(multer().array()) // parses multipart/form-data
app.use(cors());
//Clients API Routes :
app.use(process.env.CLIENT_API_PATH,require('./Routes/clientAPIRoutes'));
//Admin Pages Routes :
app.use(process.env.ADMIN_PATH,require('./Routes/adminPageRoutes'));
module.exports = app;
推荐阅读
- elasticsearch - elasticsearch 6.4 不计算字段中的 search_analyzer
- arrays - 使用 swift 中的前进、后退按钮从 url 加载数组中的图像展示
- javascript - 如何将 JSON 数组转换为 javascript 对象数组?
- python - 安装模块时出现 Odoo 错误 - XMLSyntaxError: None
- nginx - 使用 Nginx 的 React Web App 无法正确重定向
- javascript - Power BI Javascript 集成。获取访问令牌
- mysql - SQL根据时间戳差异查询数据
- python - LDA 模型的灵敏度和稳定性
- regex - 突出显示搜索结果摘录导致 PHP 错误
- python - matplotlib 将刻度与刻度结束对齐