如何在快速路由器中使用正文解析器?

Posted

技术标签:

【中文标题】如何在快速路由器中使用正文解析器?【英文标题】:How to use body-parser in express router? 【发布时间】:2017-02-20 11:33:06 【问题描述】:

我有一个包含对象的 post api,但我无法在控制台中打印它的抛出未定义我以为我缺少 body-parser 但在添加 body-parser 后我看到错误 body-parser deprecated bodyParser: use individual json/urlencoded middlewares 任何帮助将不胜感激。

routes.js

var express = require('express');
var bodyParser = require('body-parser');
var Diagram = require('./api/diagram/diagram.controller');
var router = express.Router();
router.post('/saveUpdateDiagram',bodyParser,function(req,res)
    console.log(req.body);
);

app.js

var express = require('express');
var path = require('path');
var app = express();
var bodyParser = require('body-parser');
var router = express.Router();
var route = require('./server/routes').router;
var mongoose = require('mongoose');
mongoose.connection.on('connected', function() 
    console.log('MongoDB connected ');
);


app.use(express.static(path.join(__dirname, 'public')));
app.use('/', route);
app.use(bodyParser.urlencoded(
    extended: false
))
app.use(bodyParser.json())


app.listen(8760, function() 
    console.log('I am listening 8760...');
);

【问题讨论】:

尝试使用您正在传递的bodyParser。由于您在服务器级别(通过app.use(...))使用bodyParser,因此您已经加载了中间件。 【参考方案1】:

您在 app.js 中使用 body-parser 没问题。它是一个中间件,它加载了 app.use 以便将其应用于每个传入的请求。

您可以在 routes.js 中将其删除,使其看起来像这样:`

var express = require('express');
var Diagram = require('./api/diagram/diagram.controller');
var router = express.Router();
router.post('/saveUpdateDiagram', function(req,res)
    console.log(req.body);
);

` 另外,尝试替换:

app.use(bodyParser.urlencoded(
    extended: false
))

与:

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

【讨论】:

我从 routes.js 中删除了 body-parser ,但我仍然在控制台中打印 undefined 不知道为什么 根据我编辑中的示例,查看设置扩展为 true 是否有效。 我从应用程序中删除了 body-parser 并添加到路由器并使用与应用程序相同的 `router.use(bodyParser.urlencoded(extended: false ))' 它对我有用【参考方案2】:

这意味着使用 bodyParser() 构造函数已被弃用,截至 2014-06-19。

 app.use(bodyParser()); //Now deprecated You now need to call the methods separately
 app.use(bodyParser.urlencoded());

 app.use(bodyParser.json()); //And so on.

如果您仍然收到带有 urlencoded 的警告,则需要使用

 app.use(bodyParser.urlencoded(
     extended: true
 ))

扩展配置对象键现在需要显式传递,因为它现在没有默认值,如 over here. 所说

【讨论】:

我在app.js中单独调用方法【参考方案3】:

您在 app.js 中使用 body-parser 没问题。它是中间件,它加载了 app.use 但 问题是您使用 app.use('/', route); 的位置;它应该放在下面 app.use(bodyParser.urlencoded( 扩展:真 ));

【讨论】:

这是我的问题。【参考方案4】:

简单的方法, 使用以下命令安装 body-parser

npm install -g body-parser

然后在你的应用程序中使用它

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

然后你可以在你的应用中使用它添加以下代码行

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

【讨论】:

body 解析器现已内置。

以上是关于如何在快速路由器中使用正文解析器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ui-router 解析器中重定向?

带有自定义标头的 Express 正文解析器

如何使用角度路径解析器从api解析数据

不推荐使用正文解析器

请求不使用正文解析器显示数据

使用 GraphQL 的 Angular2 服务和路由解析器