我在使用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
s的输出:
// 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-type
被正确定义为application/x-www-form-urlencoded
,因为bodyParser应该正常工作,我已经通过在Safari中弹出调试工具并验证表单来验证它已经过去了数据存在。
答案 0 :(得分: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'));
tl; dr在您调用app.configure()和app.listen()之间移动您的路线。
答案 1 :(得分:2)
我有类似的问题,我发现这是因为破坏/缺少express.bodyParser()。 相反,express的bodyParser我使用了connect的bodyParser,它就像一个魅力:
app.use(require('connect').bodyParser());