express.Router和app.get之间的区别?

时间:2015-02-03 17:31:20

标签: node.js express

我从NodeJSExpress 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)

那么,两个例子之间的区别是什么?

如果我只是想做一个简单的测试网站,我应该使用哪一个?

9 个答案:

答案 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上有一篇很好的文章描述了路由器之间的差异和可以做些什么。

总结

使用路由器,您可以更轻松地模块化代码。您可以将路由器用作:

  
      
  1. 基本路线:主页,关于
  2.   
  3. 路由中间件以将请求记录到控制台
  4.   
  5. 路线参数
  6.   
  7. 路由参数中间件以验证特定参数
  8.   
  9. 验证传递给特定路线的参数
  10.   

注意:

在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());  
});

传递给 bigAppbigApp.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

这可能是一个大问题,因为 thisbigApp.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 以及您在不知不觉中使用的各种其他属性 - 您可能不希望它们重复和分离。

较小的 API

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.Routerapp.get()相比可以做更多事情,例如中间件,此外,您可以使用express.Router()

定义另一个路由器对象

答案 8 :(得分:0)

在测验中的一个问题中,有人问到:"express.Router()创建一个行为类似于应用程序对象的对象。“

正确答案是“正确”。我知道我们都可以使用两者之一来创建路由器,但是可以肯定地说,在所有情况下它们都不相同吗?如果我的理解是正确的,则express()变量可以做更多的事情,例如启动服务器,而另一个则不能。