express.Router和app.get的区别?
我从NodeJS
和Express 4
,我有点困惑。 我一直在阅读express
网站,但不能看到_当使用路由处理程序或何时使用express.Router
。
正如我所看到的,如果我想显示一个页面或当用户点击/show
例如我应该使用:
var express = require('express') var app = express() app.get("/show", someFunction)
开始的时候,我觉得这个比较老,对于express3
,这是正确的还是这样呢?
如果这是express4
的方法, express4
使用的是什么?
我读了几乎相同的例子,但使用express.Router
:
var express = require('express'); var router = express.Router(); router.get("/show", someFunction)
那么,这两个例子有什么区别呢?
如果我只是想做一个简单的testing网站,我应该使用哪一个?
app.js
var express = require('express'), dogs = require('./routes/dogs'), cats = require('./routes/cats'), birds = require('./routes/birds'); var app = express(); app.use('/dogs', dogs); app.use('/cats', cats); app.use('/birds', birds); app.listen(3000);
dogs.js
var express = require('express'); var router = express.Router(); router.get('/', function(req, res) { res.send('GET handler for /dogs route.'); }); router.post('/', function(req, res) { res.send('POST handler for /dogs route.'); }); module.exports = router;
当在app.js中调用express()
,返回一个应用程序对象。 将一个应用程序对象想象成一个Express应用程序。
当express.Router()
被调用时,会返回一个稍微不同的“小应用程序”。 “迷你应用程序”背后的想法是,你的应用程序中的不同路线可能会变得相当复杂,你可以将该逻辑移到一个单独的文件中。
在上面这个简单的例子中, / dogs路由的逻辑已经被移到了它自己的文件中,所以它的GET和POST处理程序不会把app.js弄乱。 现在,您可以独立处理任何请求到/狗的逻辑,而不用担心它将如何影响/猫和/鸟 。
如果您有与所有三条路线有关的逻辑(称为Express的中间件),则可以将其放在app.use(...)
调用之上的app.js中。 如果您的逻辑与这些路由( / dog )中的一个有关,那么您只将它放在该路由的文件中。
Express 4.0附带新的路由器。 正如在网站中所提到的:
express.Router类可用于创build模块化可挂载的路由处理程序。 路由器实例是一个完整的中间件和路由系统, 由于这个原因,它通常被称为“迷你应用程序”。
在https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4上有一篇很好的文章,描述了不同之处以及路由器可以做些什么。;
总结
使用路由器,您可以更容易地模块化您的代码,您可以使用路由器:
- 基本路线:首页,关于
- 路由中间件将请求logging到控制台
- 使用参数路由
- 路由中间件的参数来validation特定的参数
- validation传递给某个路由的参数
注意:
Express 4中删除的app.router
对象已经在Express 5中复出。在新版本中,它仅仅是基本Express路由器的参考,与Express 3不同,在Express 3中,应用程序必须显式加载它。
使用app.js写路由意味着它们可以被所有用户访问,因为app.js是在应用程序启动时加载的。 但是,在express.router()迷你应用程序中放置路线会保护和限制其可访问性。
app.route('/book') .get(function (req, res) { res.send('Get a random book') }) .post(function (req, res) { res.send('Post a random book') })
如上例所示,我们可以在一个路由下添加不同的HTTP请求方法。
总之, express.Router
与app.get()
相比,可以做更多的事情,比如中间件,而且可以用app.get()
来定义一个路由器对象express.Router()