在Express路由中,应用程序级和路由器级中间件有什么区别?

38
Express 文档 中提到:

使用 app.use() 和 app.VERB(),将应用级别的中间件绑定到 express 实例上。

路由级别的中间件的工作方式与应用级别的中间件基本相同,只是它们绑定到 express.Router() 实例而不是 express 实例上。在上面的示例中,在应用级别创建的中间件系统可以使用以下代码在路由器级别复制。

在 Express 生成器提供的应用程序中,我在主要的 app.js 中看到了:

var routes = require('./routes/index');
app.use('/', routes);

而在./routes/index.js中,我看到了这个:

var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

module.exports = router;

app.use将中间件函数添加到应用程序级别的请求处理管道中,而router.get将路由处理函数添加到特定路径的请求处理管道中。使用app.get时,路由仅限于应用程序级别。因此,router.get允许我们在应用程序级别之外定义路由,并且可以更好地组织代码。

3个回答

27
app.use传递给router.get的目的是什么,为什么不直接使用app.get? 这只是为了实现模块化设计。它允许将应用程序分成几个较小的松耦合部分,并且因为它们都不会直接了解共享的app实例,从而将它们组合在一起,因此实现了模块化。 例如,你可以构建一个完整的用户账户子系统,处理注册、登录、忘记密码等,并通过"挂载"到其他应用程序中来共享它,方法是通过app.use(require("my-user-system"))。 这就是背后的唯一目的。否则,在功能、技术或性能方面没有差别。
在路由方面,app.VERB和router.VERB有什么区别? 没有区别。应用程序有自己的主/主要路由器,app.VERB只是等效于app.router.VERB的便利语法。

1
那么express.Router()app = express() 将是同一个对象吗? - Michael Hirschler
1
@MichaelHirschler 不是的。通常情况下,您只有一个应用程序,但有多个路由器。 - Macarse

15

一个例子可以帮助理解:

在 birds.js 文件中:

// birds.js

var express = require('express');
var router = express.Router();

// middleware that is specific to this router
router.use(function timeLog(req, res, next) {
    console.log('Time: ', Date.now());
    next();
});
// define the home page route
router.get('/', function (req, res) {
    res.send('Birds home page');
});

在 app.js 文件中:

// app.js

const express = require('express')
const app = express()

var birds = require('./birds');
app.use('/birds', birds);

app.listen(3000, () => console.log('app listening on port 3000!\naccess http://localhost:3000/birds/'))

现在对于http://localhost:3000/birds/的请求将会转到birds.js文件。

这种模块化的方法将使得代码库的维护更加容易,随着应用的扩大。

来源:https://expressjs.com/en/guide/routing.html


4

应用程序具有方法listen和一些路由器没有的其他方法。

应用程序“做”主要任务,而路由器仅组合某些路由,提供封装(请参见Manohar的答案示例)。

路由器中的路由不一定事先知道完整的路由是什么。请看示例,'/birds' 在app.js中定义,这是birds.js的路由器根... app.VERB和router.VERB之间的区别在于上下文。


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