Node js无法通过php从curl请求读取数据

Node js无法通过php从curl请求读取数据,php,node.js,curl,Php,Node.js,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) {

我在读取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应用程序[web.1]:TypeError:无法读取未定义的属性“length”。
我不知道我的错误在哪里,为什么我不能读取节点js上的json数据,任何帮助都会很有用。

在php/curl中,您似乎没有正确地将主体添加到请求中。因此,
req.body.content
未定义的
。访问
undefined
上的属性会抛出错误,因此您需要在JS代码中检查这种可能性,但系统中的真正问题是您没有用php发送正文。希望这能帮助您找到问题的根源,并且您可以从中找出如何将正文数据附加到请求。

您的代码有两个明显的错误,并且由于PHP糟糕的libcurl包装器,PHP在发现时甚至不会警告您

CURLOPT_HEADER决定curl是否应该在输出中打印接收到的头和正文,它甚至不接受数组,它接受bools(true/false/0/1),如果api设计良好,当给CURLOPT_头指定除bool以外的任何内容时,您将得到一个
InvalidArgumentException
TypeError
。。但是因为它设计得不好,php只是。。。“将数组转换为布尔值”(表示如果数组为空,则为
false
,否则为
true

这里实际需要的是
CURLOPT_HTTPHEADER
,用于设置HTTP请求头的选项,使用数组

此外,

    'Content-Length: ' . mb_strlen(json_encode($post))

这是错误的,首先mb_strlen()提供字符串中unicode字符的数量,而
内容长度
头应该包含字节数,而不是unicode字符数,因此它应该是strlen(),而不是mb_strlen()-其次,如果不添加,curl将自动添加此头,而且curl不会出现任何打字错误,也不会计算错误的长度,因此您最好让curl自动添加此标题(您计算的长度错误,curl不会出错,而且人类也容易引入打字错误,curl有测试套件来确保“内容长度”中没有打字错误)header,相比之下,我打赌您的项目没有testsuites来确保您没有在
内容长度
header中引入任何打字错误)

是的,在postman中,我使用原始json内容发送到请求,好的,我将尝试通过body发送信息,而不是作为原始json对象不,请求body实际上很好,问题在于,请求头是古怪的(例如,他的请求的“内容类型”表示
application/x-www-form-urlencoded
,这会将fsck与NodeJS混淆)
    'Content-Length: ' . mb_strlen(json_encode($post))