Node.js express.json中间件没有按预期解析请求

时间:2014-02-09 15:34:12

标签: javascript json node.js express

我有一个简单的cURL(我认为这是对的)将一个小的JSON对象发布到我的快速服务器上:

curl -d "{'test': 'this'}" localhost:3000/rest/user/authenticate

我已明确表示:

// set up body parsing in express  to be able  to get parse JSON posts
server.use(express.json());
server.use(express.urlencoded());

并拥有接受路线的处理程序:

JSON = require('JSON')
module.exports = {
    authenticateUser: function create(req, res){
        var postedObject = req.body
        console.log(postedObject)
        res.send('Handle Post: authenticateUser');
    }
}

处理程序被调用,但它正在意外地记录JSON主体:

{ '{\'test\': \'this\'}': '' }

所以我的整个对象看起来是JSON Name:Value对象的名称。无论我发布什么,它似乎都附加了价值方面。除非我做这样的事情:

curl -d "a=a" localhost:3000/rest/user/authenticate

记录:

{'a':'a'}

所以我没有设置正确的标题?配置快递错了吗?我计划挖掘快速代码,但想知道在找到解决方案之前是否有人可能知道。无论哪种方式,在网络上对此进行搜索/索引答案都会很好。

更新1

好的我需要将标题添加到cURL

curl -H "Content-Type: application/json" -d "{'test': 'this'}" localhost:3000/rest/user/authenticate

给出错误:

Parsing: {'test': 'this'}
SyntaxError: Unexpected token '
    at Object.parse (native)
    at C:\blah\node_modules\express\node_modules\connect\lib\middleware\json.js:86:19
        at IncomingMessage.onEnd (C:blah\node_modules\express\node_modules\connect\node_modules\raw-body\index.js:109:7)
        at IncomingMessage.g (events.js:180:16)
        at IncomingMessage.EventEmitter.emit (events.js:92:17)
        at _stream_readable.js:920:16
        at process._tickCallback (node.js:415:13)

OR     curl -H“Content-Type:application / json”-d“{test:'this'}”localhost:3000 / rest / user / authenticate

给出错误:

Parsing: {test: 'this'}
SyntaxError: Unexpected token t
    at Object.parse (native)
    at C:\blah\node_modules\express\node_modules\connect\lib\middleware\json.js:86:19
        at IncomingMessage.onEnd (C:blah\node_modules\express\node_modules\connect\node_modules\raw-body\index.js:109:7)
        at IncomingMessage.g (events.js:180:16)
        at IncomingMessage.EventEmitter.emit (events.js:92:17)
        at _stream_readable.js:920:16
        at process._tickCallback (node.js:415:13)

更新2

在文件connect / lib / middleware / json.js

这条线似乎是造成问题的那条

req.body = JSON.parse(buf, options.reviver);

更新3

我真的认为这是我的cURL

buf= JSON.stringify({test: 'This'});
console.log(buf)
req.body = JSON.parse(buf, options.reviver);

首先进行日志记录     { “测试”: “这个”}

然后在我的处理程序中:

----------------------
{ test: 'this' }
----------------------

4 个答案:

答案 0 :(得分:24)

1)JSON中间件仅在请求具有Content-Type: application/json标头时才有效 2)有效的JSON应包含",而不是' 所以它应该是'{"test": "this"}'而不是"{'test': 'this'}"

尝试此命令:

curl -d '{"test": "this"}' -H "Content-Type: application/json" localhost:3000/rest/user/authenticate

答案 1 :(得分:6)

答案有两部分

  1. 添加内容标题
  2. Windows上的
  3. 经历了正确传递json的痛苦,我的windows机器上的cURL没有处理单引号和双引号的交换,因此正确的cURL是

    curl -H“Content-Type:application / json”-d“{”“”test“”“:”“”this“”“}}”localhost:3000 / rest / user / authenticate

    < / LI>

    是的,在数据​​参数内部,您需要使用三个双引号向服务器发送一个双引号。

    接受zub的回答,因为他是对的。我正在尝试一堆东西绕过这里的窗户。

答案 2 :(得分:2)

对于那些使用像我这样的邮递员的人,只需尝试发送请求为POST&gt;&gt; RAW并创建你的Json来做帖子,在我的测试中我创建了一个像这样的简单json并且有效:

{     &#34; name&#34;:&#34; test&#34; }

使用form-data或x-www-form-urlencoded,它不起作用。

答案 3 :(得分:0)

在Windows cmd:

curl -H "Content-Type: application/json" -d "{"""test""": """this"""}" localhost:3000/rest/user/authenticate

或使用cygwin:

curl -H "Content-Type: application/json" -d '{"test": "this"}' localhost:3000/rest/user/authenticate 

我的2美分