开发者问题收集

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

2020-08-18
1286

我在 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 数据,任何帮助都将不胜感激。

3个回答

我在尝试执行此操作时遇到了同样的问题。可以使用 http_build_query($post) 而不是 json_encode 来解决。 如果您使用的是 express JS,请确保您有以下处理程序。

app.use(express.urlencoded({ extended: false }));
app.use(express.json());
RamaKrishna
2022-02-20

您的代码有 2 个值得注意的错误,并且由于 PHP 的糟糕 libcurl 包装器,php 在注意到时甚至不会警告您

curl_setopt($ch, CURLOPT_HEADER, [

CURLOPT_HEADER 决定 curl 是否应在输出中将收到的标头与正文一起打印,并且它甚至不接受数组,它接受布尔值(true/false/0/1)

如果 api 设计良好,则在为 CURLOPT_HEADER 提供除布尔值以外的任何值时,您会收到 InvalidArgumentExceptionTypeError 。但是因为它设计不佳,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 标头中引入任何拼写错误)

hanshenrik
2020-08-18

看来您没有在 php/curl 中正确将正文添加到请求中。因此, req.body.contentundefined 。访问 undefined 上的属性会引发错误,因此您需要在 JS 代码中检查这种可能性,但系统中的真正问题是您没有在 php 中发送正文。希望这能帮助您找到问题的根源,然后您就可以从那里找出如何将正文数据附加到请求中。

Ben Steward
2020-08-18