如果使用下面这种命名方式对input元素命名
<form method="post" action="/">
<input type="text" name="user[name]">
<input type="text" name="user[email]">
<input type="submit" value="Submit">
</form>
在express3.X中可以用
app.use(express.bodyParser());
app.post('/', function(request, response){
console.log(request.body.user.name);
console.log(request.body.user.email);
});
但是在express4.X的body-parser中却死活不能用console.log('req.body.user;)
的形式来取了,熬了一晚上了没找到答案,求大神指点
4里很多中间件已经去掉了,试试
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
@DevinXian 谢谢回复,我了解4.X的中间件模式变化了,你给的方式试过,但不行。 如果有人明确知道4.x下这种方式不适用,请告知一下,我干脆就死了这条心了…
@mystzhm 打印一下req.body,看是不是解析到表单提交内容了
出来 是这样的{ 'user[name]': '', 'user[email]': '' }
,不像 Php 那样
@coolicer 因为你form表单里的name就是user[name]这种形式的,你改成
<input type="text" name="name">
@DevinXian 可以解析到,比如用req.body[‘user[name]’] 这种形式,我看网上各种介绍,3.X里都可以直接解析成req.body.user对象。
@nekron 改了就没意义了,我问的就是user[name]这种格式的,谢谢。
为毛不看看body-parser的源代码。。。
Form 里这样命名不常见,用变量名命名不就成了。
@mystzhm 那bodyparser中间件的配置修改一下,改成
app.use(bodyParser.urlencoded({ extended:true}));
@nekron 虽然不是我问,但是还是学到。
用ajax手动传递不会错了吧.
@nekron bingo!!! 多谢,这个方法搞定了,谢谢大家。
昨天还看了这个参数的英文文档,没看出个所以然来,原来就是它的问题…
总结一下,避免后来人踩坑。
在console.log('app.use(bodyParser.urlencoded({extended:true})))
里面把extended 设成true以后,会使用qs库而不是querystring库,而在qs库的介绍里面,有这么一句 ‘A querystring parser that supports nesting and arrays, with a depth limit’,看来这个’nesting’就是关键所在了。
再次感谢各位