Nodejs和PHP是两种常用的后端技术,在实际开发中经常需要实现两者之间的数据传递,不少开发者会遇到Nodejs发送数据后PHP端无法接收的情况,这类问题大多和请求配置有关。

常见出错原因排查
1. 请求格式不匹配
Nodejs发送数据时如果格式和PHP期望的不一致,就会导致接收失败。比如Nodejs用JSON格式发送,但PHP默认只会解析表单格式的数据。
Nodejs端发送JSON数据的示例代码:
const http = require('http');
const querystring = require('querystring');
// 要发送的数据
const postData = JSON.stringify({
name: '张三',
age: 20
});
const options = {
hostname: '127.0.0.1',
port: 80,
path: '/receive.php',
method: 'POST',
headers: {
'Content-Type': 'application/json', // 声明发送的是JSON格式
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('PHP返回结果:', data);
});
});
req.on('error', (err) => {
console.error('请求出错:', err);
});
req.write(postData);
req.end();
对应的PHP端如果直接用$_POST获取是拿不到数据的,需要手动解析输入流:
<?php
// 获取输入流内容
$input = file_get_contents('php://input');
// 解析JSON数据
$data = json_decode($input, true);
if ($data) {
echo '接收到数据:';
print_r($data);
} else {
echo '未接收到有效数据';
}
?>
2. 编码不一致问题
如果数据中包含中文,Nodejs和PHP的编码不一致也会导致乱码或者接收失败。Nodejs默认使用UTF-8编码,PHP端也需要保证编码统一。
可以在PHP脚本开头设置编码:
<?php
header('Content-Type: text/html; charset=utf-8');
// 后续处理逻辑
?>
Nodejs发送中文数据时,不需要额外转码,只要保证发送的内容是UTF-8格式即可,上面的JSON发送示例已经默认使用UTF-8编码。
3. 请求头配置错误
如果Nodejs发送的是表单格式数据,但是请求头的Content-Type设置错误,PHP也无法正常解析。比如发送表单数据却写成了application/json。
Nodejs发送表单格式数据的正确示例:
const http = require('http');
const querystring = require('querystring');
// 表单格式数据
const postData = querystring.stringify({
name: '李四',
age: 22
});
const options = {
hostname: '127.0.0.1',
port: 80,
path: '/receive.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded', // 表单格式声明
'Content-Length': Buffer.byteLength(postData)
}
};
const req = http.request(options, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('PHP返回结果:', data);
});
});
req.on('error', (err) => {
console.error('请求出错:', err);
});
req.write(postData);
req.end();
这种情况下PHP可以直接用$_POST获取参数:
<?php
header('Content-Type: text/html; charset=utf-8');
if (isset($_POST['name'])) {
echo '接收到name: ' . $_POST['name'];
} else {
echo '未接收到参数';
}
?>
快速排查步骤
- 先检查Nodejs发送的请求头
Content-Type是否和发送的数据格式匹配 - 查看PHP端是否用对应的方式获取参数,JSON格式用
php://input解析,表单格式用$_POST - 确认两端编码都是UTF-8,避免中文乱码导致解析失败
- 可以用抓包工具查看Nodejs实际发送的请求内容,确认数据是否正确发出
注意事项
如果Nodejs使用的是第三方请求库比如axios,也要注意设置正确的请求头和数据格式,避免库默认配置导致格式错误。另外如果PHP端有开启相关的安全过滤配置,也可能拦截部分请求,需要检查服务器的配置规则。