Express(或Connect)的bodyParser中间件被标记为已弃用,建议用户改为:
app.use(connect.urlencoded())
app.use(connect.json())
但是,当我从 Node.js in Action 中运行一个示例时,我使用curl来填写表格所建议的表格:
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。
编辑:快递4的解决方案
以这种方式解析json:
var bodyParser = require('body-parser');
...
app.use(bodyParser.json());
以这种方式解析urlencoded身体:
app.use(bodyParser.urlencoded({extended: true}));
然后没有弃用警告。 extended:true(默认值)使用qs模块,false使用querystring模块解析主体。
请勿使用app.use(bodyParser())
,现已弃用该用法。
答案 0 :(得分:28)
bodyParser
实际上是三个中间件的组合(请参阅documentation和relevant source code):json
,urlencoded
和multipart
:< / p>
json
解析application/json
请求正文urlencoded
解析x-ww-form-urlencoded
请求正文multipart
解析multipart/form-data
请求正文,这是您感兴趣的内容。如果您只指定json
和urlencoded
中间件,则表单数据将不会被任何中间件解析,因此将不会定义req.body
。然后,您需要添加一个能够解析表单数据的中间件,例如强大的,busboy或多方(如connect
's documentation中所述)。
以下是一个示例,使用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);
});
不要忘记,通过使用此类中间件,您可以允许任何人将文件上传到您的服务器:然后您有责任处理(并删除)这些文件。