我从NodeJS
和Express 4
开始,我有点困惑。我一直在阅读express
网站,但看不到_when使用路由处理程序或何时使用express.Router
。
正如我所看到的,如果我想在用户点击/show
时显示页面或其他内容,我应该使用:
var express = require('express')
var app = express()
app.get("/show", someFunction)
一开始,我认为这已经过时了,对于express3
,是正确的还是这也是express4
的方式?
如果这是在express4
中执行此操作的方法,express.Router
用于什么?
我阅读的内容几乎与上面相同,但使用的是express.Router
:
var express = require('express');
var router = express.Router();
router.get("/show", someFunction)
那么,两个例子之间的区别是什么?
如果我只是想做一个简单的测试网站,我应该使用哪一个?
答案 0 :(得分:256)
<强> 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;
调用var app = express()
时,将返回一个app对象。可以将其视为主要应用。
调用var router = express.Router()
时,会返回略有不同的迷你应用。 迷你应用背后的想法是,您应用中的每条路线都会变得非常复杂,并且您可以将所有代码移动到单独的文件中。每个文件的路由器都变成迷你应用,其结构与主应用非常相似。
在上面的示例中, / dogs 路由的代码已移至其自己的文件中,因此它不会使主应用变得混乱。 / cats 和 / birds 的代码在自己的文件中的结构类似。通过将此代码分成三个迷你应用程序,您可以单独处理每个代码的逻辑,而不用担心它会如何影响其他两个。
如果您拥有与所有三条路线相关的代码(中间件),则可以在app.use(...)
来电之前将其置于主应用中。如果您的代码(中间件)只与其中一条路由相关,则可以将其放在该路径的文件中。
答案 1 :(得分:18)
Express 4.0附带新的路由器。正如网站上提到的那样:
express.Router类可用于创建模块化可安装路由 处理程序。路由器实例是一个完整的中间件和路由 系统;因此,它通常被称为“迷你app”。
https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4上有一篇很好的文章描述了路由器之间的差异和可以做些什么。
总结
使用路由器,您可以更轻松地模块化代码。您可以将路由器用作:
- 基本路线:主页,关于
- 路由中间件以将请求记录到控制台
- 路线参数
- 路由参数中间件以验证特定参数
- 验证传递给特定路线的参数
醇>
注意:
在Express 4中删除的app.router
对象已在Express 5中卷土重来。在新版本中,它只是对基本Express路由器的引用,与Express 3不同,在Express 3中,应用程序必须明确加载它。
答案 2 :(得分:4)
C:\Program Files (x86)\JetBrains\IntelliJ IDEA 2016.3.3\plugins
如上例所示,我们可以在路径下添加不同的HTTP请求方法。
答案 3 :(得分:3)
让我们说您的应用程序并不复杂。因此,我们首先要做的是将应用程序划分为多个模块,以便一个模块中的更改不会使其他模块混乱,您可以继续处理单个模块,但是最终,您需要将所有内容集成到一个模块中正在构建一个应用程序。就像我们有一个主应用程序,而有几个父级应用程序是子应用程序一样。 因此,当我们创建父应用程序时,我们使用
创建一个var express = require('express');
var parent = express();
对于这个父应用程序,我们需要引入子应用程序。但是由于子应用程序不是完全不同的应用程序(因为它们在相同的context-java术语中运行),所以express通过Expresse的Router函数提供了实现此功能的方法,这是我们在每个子模块文件中所做的事情,让我们将其中一个子模块称为 aboutme 。
var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;
通过 module.exports ,我们使该模块可供其他用户使用,并且由于我们已经进行了模块化,因此我们需要通过节点的require函数将模块文件提供给父应用程序,就像其他任何第三方模块和父文件看起来都像这样。
var express = require('express')
var parent = express()
var child = require(./aboutme)
在此子模块对父级可用之后,我们需要告诉父级应用程序何时使用此子级应用程序。可以说,当用户点击关于我的路径时,我们需要关于我的子应用程序来处理请求,然后使用Expresse的 use 方法来完成该请求。
parent.use('/aboutme', aboutme);
一枪中,父文件看起来像这样
var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',aboutme);
父母可以做的所有事情都是,它可以启动服务器,而孩子不能这样做。 希望这可以澄清。有关更多信息,您可以随时查看源代码,这需要花费一些时间,但它可以为您提供很多信息。谢谢。
答案 4 :(得分:1)
使用app.js编写路由意味着所有用户都可以访问它们,因为app.js是在应用程序启动时加载的。但是,在express.router()迷你应用程序中放置路径可以保护和限制其可访问性。
答案 5 :(得分:1)
express.Router
有很多选择:
/show
的路由不相同/Show
,但默认是禁用的/show/
与/show
不同,并且默认情况下也被禁用答案 6 :(得分:1)
每个人,包括文档,都倾向于回顾它们有多少相同,但实际上并未提及任何差异。嗯,事实上,它们是不同的。
ping www.google.com
最明显的区别是 var bigApp = express();
var miniApp = express.Router();
会给出 bigApp
,这只是一种相当混乱的方式来完成节点 listen
或 {{1} } 模块:
http
我认为这是一种反模式,因为它首先抽象和掩盖了一些并不复杂或困难的东西,然后使人们难以使用需要原始 http 服务器的 websockets 和其他中间件。< /p>
真正重要的最大区别是所有 https
都有单独的内部状态。
var server = require('http').createServer(bigApp);
server.listen(8080, function () {
console.info(server.address());
});
传递给 bigApp
的 bigApp.enable('trust proxy');
bigApp.enabled('trust proxy');
// true
var bigApp2 = express();
bigApp2.enabled('trust proxy');
// false
bigApp.use('/bunnies', bigApp2);
// WRONG! '/bunnies' will NOT trust proxies
将由 miniApp
以这样一种方式进行操作,即保留其内部状态和 bigApp
路由将相应地表现。
bigApp
这可能是一个大问题,因为 this
对 bigApp.enable('trust proxy');
bigApp.enabled('trust proxy');
// true
var miniApp = express.Router();
bigApp.use('/bunnies', miniApp);
// CORRECT! All state and such are preserved
和 express
对象做了很多(有时是复杂的)事情 - 例如修改(或劫持){{1} } 和 http.ServerRequest
以及您在不知不觉中使用的各种其他属性 - 您可能不希望它们重复和分离。
httpServerResponse
可以使用的函数数量更少、定义更明确:
req.url
req.originalUrl
Router
.use(mount, fn)
.all(mount, fn)
.options(mount, fn)
.head(mount, fn)
.get(mount, fn)
.post(mount, fn)
.patch(mount, fn)
.put(mount, fn)
还有一些其他方便的方法,例如 .delete(mount, fn)
,但您不会找到 .route(mount).XXXX
或 .param(name, cb).XXXX
或其他改变较大应用状态的方法。>
答案 7 :(得分:0)
总之,express.Router
与app.get()
相比可以做更多事情,例如中间件,此外,您可以使用express.Router()
答案 8 :(得分:0)
在测验中的一个问题中,有人问到:"express.Router()
创建一个行为类似于应用程序对象的对象。“
正确答案是“正确”。我知道我们都可以使用两者之一来创建路由器,但是可以肯定地说,在所有情况下它们都不相同吗?如果我的理解是正确的,则express()
变量可以做更多的事情,例如启动服务器,而另一个则不能。