节点(Express)请求体为空

24

今晚我正在使用Node.JS和Restify开发一个简单的API,一切都正常,可以通过req.params.fieldname接收参数。我安装了CouchDB和Cradle,开始尝试将这些参数放入数据库中,但在安装完成后,req.params 开始为空!

之前我应该从一开始就使用Express,出于其他原因没有那么做,所以我尝试切换到它来查看是否可以使其工作,但是没有任何好结果。

var express = require('express');
var app = express.createServer();

app.configure(function(){
app.use(express.bodyParser());
app.use(express.cookieParser());
});

app.post('/', function(req, res){
  res.send(req.body);
});

app.listen(8080, function() {
  console.log('Printomatic listening at', app.url);
});

我尝试了无数种方法,但无论如何req.body都为空。 我使用http-console进行测试,并发送一些简单的内容,例如POST /{"name":"foobar"}

我非常沮丧,到了这个地步,我开始怀疑在安装Cradle/CouchDB时是否出了问题(它们分别通过NPM和Homebrew安装)。由于时间紧迫,任何帮助都将不胜感激。提前感谢任何帮助!


如果您尝试使用app.get('/', function(req,res){res.send('Hello World');};并进行GET请求,会发生什么? - bryanmac
1个回答

72

你提到你发送了 JSON 数据 ({"name": "foobar"}),请确保在请求头中添加 Content-Type: application/json,否则 bodyParser 将无法解析。

例如:

$ curl -d 'user[name]=tj' http://local/
$ curl -d '{"user":{"name":"tj"}}' -H "Content-Type: application/json" http://local/

这是因为 bodyParser 解析 application/jsonapplication/x-www-form-encodedmultipart/form-data,并根据 Content-Type 选择使用哪种解析器。


4
我感觉自己像个傻瓜。我一直在使用http-console工具,但出现了某种原因导致头信息发生了变化!谢谢! - Matt McClure
2
我使用Postman REST客户端时,使用form-data时可以工作,但发送原始数据时无法工作。在标头中设置内容类型解决了这个问题。谢谢。 - Nikhil Baliga
1
谢谢你,Nikhil!我在使用Postman时也遇到了同样的问题,我们需要设置头部:Content-Type(没有冒号)和值:application/json。 - Zack S
节省了我很多时间和麻烦 :). 谢谢! - nish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接