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

在快速文档中 ,它说:

应用程序级中间件绑定到一个express实例,使用app.use()和app.VERB()。

路由器级中间件就像应用级中间件一样工作,除了它们绑定到express.Router()一个实例外。 上例中在应用程序级别创build的中间件系统可以使用以下代码在路由器级别进行复制。

在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的目的是什么? 一般来说, app.VERBrouter.VERB在路由方面有什么区别?

app.use传递给router.get而不是简单地使用app.get的目的是什么?

这只是模块化devise。 它允许将应用程序分成几个较小的松散耦合的部分,因为他们都没有任何共享app实例的直接知识,将它们组合在一起,所以可以实现模块化。

例如,您可以构build一个完整的用户帐户子系统,用于处理注册,login,忘记密码等,并通过app.use(require("my-user-system"))

这是这背后的唯一目的。 没有function,技术或性能差异。

一般来说,app.VERB和router.VERB在路由方面有什么区别?

没有不同。 该应用程序有它自己的主要/主要路由器和app.VERB只是方便糖相当于app.router.VERB

一个例子将在这里帮助:

在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 var birds = require('./birds'); app.use('/birds', birds); 

现在请求http:// localhost:3000 / birds /将会去birds.js文件。

随着应用程序的增长,这种模块化的方法将使维护大量的代码变得容易。

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