Node.js表达express.json和express.urlencoded with form submit

时间:2014-03-03 09:36:22

标签: node.js express

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

1 个答案:

答案 0 :(得分:28)

bodyParser实际上是三个中间件的组合(请参阅documentationrelevant source code):jsonurlencodedmultipart:< / p>

  • 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);
});

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