Node.js Express express.json 和 express.urlencoded 与表单提交

标签 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。

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

最佳答案

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

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

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

关于Node.js Express express.json 和 express.urlencoded 与表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22143105/

相关文章:

node.js - Web3js 无法在 Azure 上编译

node.js - Azure 存储队列 - Cosmos DB 输出 - 错误处理

node.js - 在 Oracle linux 中为 nodejs 应用程序创建服务

node.js - 使用 typescript 时 nodejs 中间件的 this 范围

javascript - "Can' t 发送后设置 header ”和清空发布请求正文

pdf - 通过 grunt-contrib-connect 在浏览器中显示 PDF

node.js - Mongoose 不返回自定义 ID

node.js - 为什么我们需要快速正文解析器?

node.js - 解析 Post 表单数据 Node.js Express

node.js - 在MVC中,使用ORM时我只需要模型吗?