Node.js使用表单提交express.json和express.urlencoded

Express(或Connect)的bodyParser中间件被标记为不build议使用,build议用户使用:

app.use(connect.urlencoded()) app.use(connect.json()) 

但是,当我从Action中的Node.js运行一个示例时,我使用curl来填写本书build议的表单:

 curl -F entry[title]='Ho ho ho' -F entry[body]='santa loves you' http://abc:123@127.0.0.1:3000/api/entry 

它不起作用。 req.body没有定义。 我错过了什么吗? 它与bodyParser正常工作。

编辑:从expression式4的解决scheme

这样parsingjson:

 var bodyParser = require('body-parser'); ... app.use(bodyParser.json()); 

用这种方式parsingurlencoded body:

 app.use(bodyParser.urlencoded({extended: true})); 

那么没有贬低警告。 扩展:true(默认)使用qs模块,false使用查询string模块来分析正文。

不要使用app.use(bodyParser()) ,现在不推荐使用这个用法。

bodyParser实际上是三个中间件的组成(参见文档和相关源代码 ): jsonurlencodedmultipart

  • jsonparsingapplication/json请求体
  • urlencoded分析x-ww-form-urlencoded请求体
  • multipartparsingmultipart/form-data请求体,这是你感兴趣的。

如果只指定了jsonurlencoded中间件,那么表单数据将不会被任何中间件parsing,因此req.body不会被定义。 然后,您需要添加一个中间件,能够parsingforms数据,如强大的,busboy或multiparty(如connect的文档中所述 )。

这里是一个使用multiparty的例子:

 var multipart = require('connect-multiparty'); var multipartMiddleware = multipart(); app.use('/url/that/accepts/form-data', multipartMiddleware); app.post('/url/that/accepts/form-data', function(req, resp) { console.log(req.body, req.files); }); 

不要忘记,通过使用这样的中间件,您允许任何人将file upload到您的服务器:然后您有责任处理(和删除)这些文件。