【问题标题】:How to fix 'SyntaxError: Unexpected token # in JSON at position 0' - POST null body如何修复'SyntaxError: Unexpected token # in JSON at position 0' - POST null body
【发布时间】:2019-08-16 00:22:37
【问题描述】:

我有一个运行 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 / 语法错误:

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

似乎没有到达 Express,所以我想该请求已被预先解析和验证? 如何记录请求以分析拒绝的原因?

谢谢

【问题讨论】:

  • 您检查过 Stackdriver 日志中的一些日志注册表吗?

标签: express google-cloud-platform


【解决方案1】:

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

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

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

{
  "value": null
}

或作为数组中的元素

[null]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-30
    • 2017-12-15
    • 2021-01-29
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多