2015-04-05 105 views
18

Express docs,它说:在Express中路由时,应用层和路由器级中间件有何区别?

应用级中间件必将Express实例,使用app.use()和app.VERB()。

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

在由快速生成提供的应用程序,我在主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之间有什么区别?

回答

17

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

这都是为模块化设计的。它允许应用程序分成几个较小的松散耦合的部分,并且因为他们都没有直接了解将它们组合在一起的共享的实例,所以可以实现模块化。

例如,您可以构建一个完整的用户帐户子系统,用于处理注册,登录,忘记密码等,并通过app.use(require("my-user-system"))将其“安装”在几个不同的应用程序之间。

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

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

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

+0

所以'express.Router()'和'应用=快递()'将是相同的对象? – 2018-01-24 14:39:24

3

的例子将在这里帮助:

在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

相关问题