如何修复'SyntaxError:位于0的JSON中的意外的令牌#' - POST null body

问题描述 投票:0回答:1

我有一个运行Express的云功能作为Web挂钩端点。我的客户端发送一个带有空体值的POST请求。并且该服务使用此日志返回400 Bad Request:

    SyntaxError: Unexpected token # in JSON at position 0
    at Object.parse (native)
    at createStrictSyntaxError (/var/tmp/worker/node_modules/body-parser/lib/types/json.js:157:10)
    at parse (/var/tmp/worker/node_modules/body-parser/lib/types/json.js:83:15)
    at /var/tmp/worker/node_modules/body-parser/lib/read.js:121:18
    at invokeCallback (/var/tmp/worker/node_modules/raw-body/index.js:224:16)
    at done (/var/tmp/worker/node_modules/raw-body/index.js:213:7)
    at IncomingMessage.onEnd (/var/tmp/worker/node_modules/raw-body/index.js:273:7)
    at emitNone (events.js:86:13)
    at IncomingMessage.emit (events.js:185:7)
    at endReadableNT (_stream_readable.js:978:12)

但null是有效的JSON值。任何其他正确的JSON值似乎都很好。

更具体的例子如下:

回复200:

curl -d'{“foo”:true}' - H“Content-Type:application / json”-X POST {endpoint_url}

响应400 / SyntaxError:

curl -d null -H“Content-Type:application / json”-X POST {endpoint_url}

似乎没有达到Express,所以我认为请求是在前期解析和验证的?如何记录请求以分析拒绝的原因?

谢谢

express google-cloud-platform
1个回答
0
投票

如果我们从代码中查看堆栈跟踪,我们发现它指向大约here(源)。读取该代码后,我们似乎发现预期/必需的输入数据必须是以{(对象)或[(数组)开头的JSON。这意味着null甚至标量值都会因所描述的错误而失败。

如果我们再查看bodyParser的文档,发现here我们读到了一个名为strict的选项,当设置为true时,指示我们的解析器只接受对象或数组,而当false允许我们接受标量时。由于strict的默认值是true,我的假设是只能传入对象或数组。

如果是这种情况,那么发送null将是无效/不受支持的参数。如果您需要发送单个标量值,可以将其作为对象中字段的值发送:

{
  "value": null
}

或作为数组中的元素

[null]
© www.soinside.com 2019 - 2024. All rights reserved.