我有一个运行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,所以我认为请求是在前期解析和验证的?如何记录请求以分析拒绝的原因?
谢谢
如果我们从代码中查看堆栈跟踪,我们发现它指向大约here(源)。读取该代码后,我们似乎发现预期/必需的输入数据必须是以{
(对象)或[
(数组)开头的JSON。这意味着null
甚至标量值都会因所描述的错误而失败。
如果我们再查看bodyParser的文档,发现here我们读到了一个名为strict
的选项,当设置为true
时,指示我们的解析器只接受对象或数组,而当false
允许我们接受标量时。由于strict
的默认值是true
,我的假设是只能传入对象或数组。
如果是这种情况,那么发送null
将是无效/不受支持的参数。如果您需要发送单个标量值,可以将其作为对象中字段的值发送:
{
"value": null
}
或作为数组中的元素
[null]