Node js无法通过php读取curl请求的数据
我在 nodejs 中读取通过 curl 请求发送的数据时遇到问题。使用 Postman 一切正常,但是当我尝试通过 curl 发送请求时,api 返回 500 内部服务器错误,我不知道错误在哪里。
这是我的 php 代码
private function curl($url, $post = false, $header = false)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
if ($post) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post));
}
curl_setopt($ch, CURLOPT_HEADER, [
'Content-Type: application/json',
'Accept: application/json',
'Content-Length: ' . mb_strlen(json_encode($post))
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec ($ch);
curl_close($ch);
return $response;
}
所以现在我将与您分享 nodejs 的部分
console.log(req.body)
let content = req.body.content
if (!content.length) {
return res.status(401).send({message: 'content is required'})
}
这是日志信息
{ '{"content":"content information"}': '' }
2020-08-18T07:27:38.191100+00:00 app[web.1]: TypeError: 无法读取未定义的属性“length”。 我不知道我的错误在哪里,以及为什么我无法在 node js 上读取 json 数据,任何帮助都将不胜感激。
我在尝试执行此操作时遇到了同样的问题。可以使用
http_build_query($post)
而不是
json_encode
来解决。
如果您使用的是 express JS,请确保您有以下处理程序。
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
您的代码有 2 个值得注意的错误,并且由于 PHP 的糟糕 libcurl 包装器,php 在注意到时甚至不会警告您
curl_setopt($ch, CURLOPT_HEADER, [
CURLOPT_HEADER
决定 curl 是否应在输出中将收到的标头与正文一起打印,并且它甚至不接受数组,它接受布尔值(true/false/0/1)
如果 api 设计良好,则在为
CURLOPT_HEADER
提供除布尔值以外的任何值时,您会收到
InvalidArgumentException
或
TypeError
。但是因为它设计不佳,php 只是......“将数组转换为布尔值”(意味着如果数组为空,它将为
false
,否则为
true
)
你真正想要的是
CURLOPT_HTTPHEADER
,用于设置 HTTP 请求标头的选项,采用数组。
此外,
'Content-Length: ' . mb_strlen(json_encode($post))
这是错误的,首先
mb_strlen()
为您提供字符串中的 unicode 字符数,而
Content-Length
标头应该包含
字节
数,而不是 unicode 字符数,因此应该是 strlen(),而不是 mb_strlen()。
其次,如果您不添加此标头,curl 会自动添加它,并且 curl 不会犯任何拼写错误,也不会计算错误的长度,因此您最好让 curl 自动添加此标头(您计算的长度是错误的,curl 不会犯这个错误,而且人类容易引入拼写错误,curl 有测试套件来确保“Content-Length”标头中没有拼写错误,通过比较。
我敢打赌你的项目没有测试套件来确保你没有在
Content-Length
标头中引入任何拼写错误)
看来您没有在 php/curl 中正确将正文添加到请求中。因此,
req.body.content
为
undefined
。访问
undefined
上的属性会引发错误,因此您需要在 JS 代码中检查这种可能性,但系统中的真正问题是您没有在 php 中发送正文。希望这能帮助您找到问题的根源,然后您就可以从那里找出如何将正文数据附加到请求中。