express.Router()与app.get的区别

12

我正在使用Node.js的Express 4服务器。

在Express中,已经内置了一个路由器,如下所示:

在app.js文件中

    var router = express.Router();
    app.use(router);
    app.use('/users', usersRoutes);
在 userRoutes.js 文件中:
var router = express.Router();

router.get('/', function (req, res, next) {

}

router.get('/:user_id', function (req, res, next) {

}

router.post('/:user_id', function (req, res, next) {

}

router.put('/:user_id', function (req, res, next) {

}

router.delete('/:user_id', function (req, res, next) {

}

module.exports = router;
但我发现在线上很难找到任何关于这种类型路由器的实质性文档。对于旧的方式使用app.get,app.post,app.put,app.delete等有更多的文档。其中更加困惑的一点是,第一个参数(路由路径)似乎要求我们作为程序员从router.get/post/put/delete方法中去除app.use参数。
例如:
app.use('/users', usersRoutes);

这意味着usersRoutes中所有路由的路径都已经在开头有一个不可见的'/users',这是我还不确定是否喜欢的东西。 这意味着在usersRoutes.js中:

 var router = express.Router();

 router.get('/users/:user_id', function (req, res, next) {  //WRONG!!

    }

 router.get('/:user_id', function (req, res, next) {  //RIGHT

    }

这有点令人困惑,但也许在更长的路径上我会欣赏它。

考虑到这个 express.Router 缺乏文档 - 我认为这不是首选方法 - 但是可以用 express.Router 创建一个稳健的 RESTful 后端吗?并且它是否具备所有基本的 HTTP 动词?

另一件令人困惑的事情是 ----> 在 app.js 中,我们有一个router实例 app.use(express.Router()),这个router实例如何与其他实例交互?一开始意义不大。


Express API文档链接:http://expressjs.com/api.html - aadarshsg
1
谢谢,但那并不是真正有建设性的。例如,express.Router 的一个问题是它似乎无法与 app.params 一起使用。而且我所知道的并没有真正的 express.params 或 router.params。 - Alexander Mills
根据https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4,有一个router.params功能,但总的来说,在Express应用程序中如何多次甚至一次使用express.Router()并不是非常清楚。 - Alexander Mills
4个回答

14

如Bidhan A的回答所述,这是使用Express的首选方法,自Express 4以来就是这样。

您可以完全模块化您的代码和逻辑。

例如,您可以拥有一个名为routes/APIRouter.js的文件,其中包含此代码:

var apiRouter = express.Router();

apiRouter.get('/reports', controllers.getReports);
apiRouter.get('/reports/:id', controllers.getReport);
apiRouter.post('/reports', controllers.createReport);
apiRouter.put('/reports/:id', controllers.updateReport);
apiRouter.delete('/reports/:id', controllers.deleteReport);

你还可以有 /controllers/reportsController.js 文件,并在你的主文件 app.js 或另一个名称为server.js 的文件中最终获取:

var express = require('express');
var app = new express();
var apiRouter = require('./routes/APIRouter');
app.use('/api',apiRouter);

回答你的问题:

  1. 是的,这是首选的、某种程度上官方的做法。
  2. 是的,通过使用 Router 你可以完全控制整个 HTTP,并且你应该使用其他基于 express 的模块,如: body-parsererror-handlercookie-parser 来实现完全控制。

注意:前提是你已经知道了一个首选的一般的 Web 框架目录结构并进行了模块导出。


7

我认为这实际上是首选的方式。你可以单独定义路由并在应用程序中使用它,这提供了很好的职责分离。它还使得测试路由变得非常容易。而且,你可以使用express.Router创建一个强大的RESTful后端。此外,它还具有所有基本的HTTP动词,例如get、post、put、delete、patch等。


2
Express().get 的作用与 Express.Router().get 相同。不同之处在于,使用路由器更好的实践是因为它允许我们将 api 端点管理为中间件。
详情请见:https://expressjs.com/en/api.html#router Express 和类似的 JS 框架的问题在于文档没有解释为什么要从使用 Express 主“app”对象转变。我的猜测是我们应该将路由逻辑和主应用程序管理本身(即配置、模板、数据库连接等)分开处理。

1

非常好的问题,但没有人应该需要问这个问题。

事实上,Express是一个很好的框架。但我看到了很多关于路由处理的问题,我们都浪费了时间。即使正确地完成了,它只是一堆代码,实际上浪费了人们编写它的时间,甚至更多的是愚蠢的错误。

尝试使用Route Magic

你只需要两行代码,模块就可以读取你的目录和文件结构来处理所有app.use路由调用,就像这样:

const magic = require('express-routemagic')
magic.use(app, __dirname, '[your route directory]')

就是这样了!没有别的。

对于那些想要手动处理的人,只需不将目录传递给Magic即可。

告别

app.use('/i/repeat/myself', require('./routes/i/repeat/myself'))
app.use('/i/repeat/myself/again', require('./routes//i/repeat/myself/again'))
app.use('/i/keep/repeating/myself', require('./routes/i/keep/repeating/myself'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接