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

hug*_*gie 21 node.js express

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

app.use(connect.urlencoded())
app.use(connect.json())  
Run Code Online (Sandbox Code Playgroud)

但是,当我在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
Run Code Online (Sandbox Code Playgroud)

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

编辑:快递4的解决方案

以这种方式解析json:

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

...

app.use(bodyParser.json());
Run Code Online (Sandbox Code Playgroud)

以这种方式解析urlencoded的身体:

app.use(bodyParser.urlencoded({extended: true}));
Run Code Online (Sandbox Code Playgroud)

然后没有弃用警告.extended:true(默认值)使用qs模块,false使用querystring模块解析主体.

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

Pau*_*gel 28

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

  • json解析application/json请求主体
  • urlencoded解析x-ww-form-urlencoded请求主体
  • multipart解析multipart/form-data请求体,这是你感兴趣的.

如果您只指定jsonurlencoded中间件,则表单数据不会被任何中间件解析,因此req.body不会被定义.然后,您需要添加一个能够解析表单数据的中间件,例如强大的,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);
});
Run Code Online (Sandbox Code Playgroud)

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

  • 哦,刚刚注意到multipart也被弃用了. (3认同)