一尘不染

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

node.js

Express(或Connect的)bodyParser中间件已标记为已弃用,建议用户改为使用:

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

但是,当我从 Action中的Node.js 运行示例时,我使用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一起正常工作。

编辑:自Express 4起的解决方案

以这种方式解析json:

var bodyParser = require('body-parser');

...

app.use(bodyParser.json());

通过以下方式解析urlencoded主体:

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

则没有弃用警告。扩展名:true(默认)使用qs模块,false使用querystring模块来解析正文。

请勿使用app.use(bodyParser()),该用法现已弃用。


阅读 873

收藏
2020-07-07

共1个答案

一尘不染

bodyParser实际上三个中间件(见组合物文档相关的源代码):
jsonurlencodedmultipart

  • json解析application/json请求主体
  • urlencoded解析x-ww-form-urlencoded请求主体
  • multipart解析multipart/form-data请求主体,这就是您感兴趣的内容。

如果仅指定jsonurlencoded中间件,则任何中间件都不会解析表单数据,因此req.body不会定义。然后,您需要添加一个中间件,该中间件能够解析表单数据,例如强大,busboy或多方(如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);
});

不要忘了通过使用这样的中间件,任何人都可以将文件上传到您的服务器:这是您处理(和删除)这些文件的责任。

2020-07-07