Express js 的 body parser 不起作用,req.body 未定义?

11

我在我的Node服务器上使用Express有以下内容(仅列出重要部分):

var app = express.createServer();

app.all(/test/,function(req,res){
    console.log(req.headers);
    console.log(req.body);
    res.send("");
});

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

        app.use('/min',express.static('../min'));
        app.use('/js',express.static('../js'));
        app.use('/css',express.static('../css'));
        app.use('/img',express.static('../img'));
    });
    app.listen(8080);
}

我有一个简单的表格,可以像这样调用localhost:8080:
<form action="http://localhost:8080/test" method="post">
    <input type="hidden" name="test" value="testing"/>
    <input type="submit" name="submit" value="to node"/>
</form>

但是express.bodyParser似乎没有起作用,req.body是未定义的。这里是console.log的输出:

// req.headers
{ host: 'localhost:8080',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 Safari/534.48.3',
  'content-length': '27',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  origin: 'file://',
  'content-type': 'application/x-www-form-urlencoded',
  'accept-language': 'en-us',
  'accept-encoding': 'gzip, deflate',
  cookie: '',
  connection: 'keep-alive' }
// req.body
undefined

注意:正确定义了content-typeapplication/x-www-form-urlencoded,这是bodyParser工作所必需的。我已经通过在Safari中打开调试工具并验证表单数据是否存在来验证它是否传输过来了。

看到您的代码片段,您只需要使用 app.post('/search', ...) 而不是 app.get('/search', ...)。 - BronzeByte
2个回答

20

http://expressjs.com/guide.html#configuration

请注意使用app.router,它可以(可选)用于挂载应用程序路由,否则第一次调用app.get()、app.post()等将会挂载路由。
发生的情况是在添加任何其他中间件之前调用了app.all()。这样做实际上将app.router放在所有其他中间件的前面,导致它们永远不会在请求结束时被用于你的路由内部。
挂载应用程序路由基本上与执行app.use(app.router)相同。
最终你的堆栈看起来像这样:
app.use(app.router); // Contains your /test/ route
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use('/min',express.static('../min'));
app.use('/js',express.static('../js'));
app.use('/css',express.static('../css'));
app.use('/img',express.static('../img'));

简而言之,将路由移动到调用app.configure()和app.listen()之间。


1
嗯...我已经按照这样设置了一切,但是'req.body'仍然是'undefined'。你有任何其他想法吗?这里是代码片段:http://pastebin.com/DuawFmRr - Vitaly
3
Vitaly,你能否提供一段代码,展示你如何进行请求?如果Content-Type头部不是'application/json'或者'application/x-www-form-urlencoded',那么req.body可能会为未定义(undefined)。 - Ryan Olds
没关系。我决定使用PHP和CodeIgniter,如果需要的话再转向Node.js。 - Vitaly
“发生的情况是在添加任何其他中间件之前调用了app.all()” - 这正是我的问题。谢谢! - Ishtiaque Khan

2

我曾经遇到过类似的问题,后来发现是因为 express.bodyParser() 损坏或缺失所致。我使用了 connect.bodyParser 代替 express 的 bodyParser,问题得以解决:

app.use(require('connect').bodyParser());

2
在我的情况下,我只是在告诉它使用bodyParser()之前设置路由,但感谢您的输入 - 我希望有人能从中受益!只是一个注意事项 - 这是由express的构建引起的吗?这似乎是一个相当大的错误。 - Jesse
对我没用。'req.body' 仍然未定义。你能告诉我你正在使用哪些版本的node、connect和express吗?谢谢。 - Vitaly
抱歉,我们还没有这个环境。它是实验性的。 - Szymon Wygnański

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