发布字符串会导致快速正文解析器抛出SyntaxError

时间:2018-02-08 18:57:46

标签: json node.js express body-parser

我有以下简化代码:

'use strict'

const express = require('express')
const bodyParser = require('body-parser')
const app = express()
app.use(bodyParser.json())


const storage = {}

app.get('/', (req, res) => {
  res.send()
})

app.get('/ping', (req, res) => {
  res.send('pong')
})

;[
  'mycollection'
].forEach((collection) => {
  storage[collection] = []

  app.get(`/${collection}`, (req, res) => {
    console.log('GET /' + collection)
    return res.send(storage[collection])
  })
  app.post(`/${collection}`, (req, res) => {
    console.log('POST /' + collection)
    const item = req.body
    if (!item) return res.status(400).send({ message: 'Invalid body' })
    storage[collection].push(item)
    res.status(201).send({ message: 'Successfully added.' })
  })
})
const port = process.env.PORT || 3000
console.log('---> Running on port', port)
app.listen(port)

当我执行此请求时:

curl -X POST -H "Content-Type: application/json" -d '"test"' "http://localhost:3000/mycollection"

这给了我以下错误:

SyntaxError: Unexpected token # in JSON at position 0

但是"test"是有效的JSON。

$ node
> JSON.parse('"test"')
> "test"

1 个答案:

答案 0 :(得分:0)

我解决了。从到body-parser文档:

https://github.com/expressjs/body-parser#strict

  

strict设置为true时,只接受数组和对象; false时会接受JSON.parse接受的任何内容。默认为true。

所以这解决了它:

app.use(bodyParser.json({
  strict: false
}))