如何在Express4.X版本以req.body.user这种方式取值,express3.X版本貌似可以,但4.X一直不行
发布于 9 年前 作者 mystzhm 5252 次浏览 最后一次编辑是 8 年前 来自 问答

如果使用下面这种命名方式对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;)的形式来取了,熬了一晚上了没找到答案,求大神指点

14 回复

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’就是关键所在了。

再次感谢各位

回到顶部