【问题标题】:Node.js Express express.json and express.urlencoded with form submitNode.js Express express.json 和 express.urlencoded 与表单提交
【发布时间】:2014-04-04 06:50:43
【问题描述】:

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。

编辑:Express 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()),该用法现已弃用。

【问题讨论】:

  • 从 express 4.16.0 开始,你不再需要外部的body-parser 依赖,可以使用app.use(express.json());app.use(express.urlencoded({ extended: true })); 进行解析(来源:github.com/expressjs/express/pull/3423

标签: node.js express


【解决方案1】:

bodyParser实际上是三个中间件的组合(见documentationrelevant source code):jsonurlencodedmultipart

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

如果只指定jsonurlencoded 中间件,任何中间件都不会解析表单数据,因此不会定义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);
});

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

【讨论】:

  • 哦,刚刚注意到 multipart 也被弃用了。
  • 您可以研究替代方案,例如 busboy 或 formidable then :) API 并不完全相同
  • 我已经为这个问题添加了一个解决方案。
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2019-01-07
相关资源
最近更新 更多