我从NodeJS和Express 4开始,我有点困惑。我一直在阅读Express网站,但不知道什么时候使用路由处理程序或什么时候使用Express . router。

正如我所看到的,如果我想在用户点击/show时显示一个页面或其他东西,例如,我应该使用:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

一开始,我认为这是旧的(快车3)。这是对的,还是这是快车4的方式?

如果这是特快4的做法,什么是特快。路由器用于?

我看到了几乎和上面相同的例子,但是使用了express。路由器:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

那么,这两个例子有什么不同呢?

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


当前回答

它们有何不同

每个人,包括文档,都倾向于回顾它们有多少相同之处,但实际上并没有提及任何差异。事实上,它们是不同的。

var bigApp = express();
var miniApp = express.Router();

听()

最明显的区别是bigApp将提供listen,这只是一种相当令人困惑的方式来完成原本简单而明显的节点http或https模块:

var server = require('http').createServer(bigApp);

server.listen(8080, function () {
  console.info(server.address());  
});

我认为这是一种反模式,因为它抽象和模糊了一些本来并不复杂或困难的东西,然后让人们很难使用websockets和其他需要原始http服务器的中间件。

内部状态

最大的区别,也是非常重要的区别是,所有bigApps都有单独的内部状态。

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

然而,传递给bigApp的miniApp将由bigApp以这样一种方式进行操作,即它的内部状态和thisness将被保留,并且这些路由将相应地执行。

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对http做了很多(有时是三重的)事情。ServerRequest和httpServerResponse对象——比如修改(或劫持)req。Url和req。originalUrl和其他您一直在使用而没有意识到的属性-您可能不希望复制和分离它们。

小火

路由器可以使用的函数数量更少,定义更明确:

用(山,fn)。 所有(山,fn)。 选项(山,fn)。 头山(fn) 得到(山,fn)。 波斯特(山,fn)。 (山贴片,fn)。 普特(山,fn)。 删除(山,fn)。 XXXX(山)公路。 帕拉姆(name, cb)。XXXX

还有其他一些方便的方法,比如basic(),但你找不到set()或enable()或其他方法来改变更大的应用程序状态。

其他回答

表达。路由器有很多选项:

启用区分大小写:/show route不与/show相同,默认情况下不启用此行为 严格路由模式:/show/路由到与/show不相同,此行为默认也被禁用 我们可以为特定的路由添加特定的中间件

一句话,表达。与app.get()相比,router可以做更多的事情,比如中间件,而且,你可以用express.Router()定义一个更多的路由器对象。

它们有何不同

每个人,包括文档,都倾向于回顾它们有多少相同之处,但实际上并没有提及任何差异。事实上,它们是不同的。

var bigApp = express();
var miniApp = express.Router();

听()

最明显的区别是bigApp将提供listen,这只是一种相当令人困惑的方式来完成原本简单而明显的节点http或https模块:

var server = require('http').createServer(bigApp);

server.listen(8080, function () {
  console.info(server.address());  
});

我认为这是一种反模式,因为它抽象和模糊了一些本来并不复杂或困难的东西,然后让人们很难使用websockets和其他需要原始http服务器的中间件。

内部状态

最大的区别,也是非常重要的区别是,所有bigApps都有单独的内部状态。

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

然而,传递给bigApp的miniApp将由bigApp以这样一种方式进行操作,即它的内部状态和thisness将被保留,并且这些路由将相应地执行。

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对http做了很多(有时是三重的)事情。ServerRequest和httpServerResponse对象——比如修改(或劫持)req。Url和req。originalUrl和其他您一直在使用而没有意识到的属性-您可能不希望复制和分离它们。

小火

路由器可以使用的函数数量更少,定义更明确:

用(山,fn)。 所有(山,fn)。 选项(山,fn)。 头山(fn) 得到(山,fn)。 波斯特(山,fn)。 (山贴片,fn)。 普特(山,fn)。 删除(山,fn)。 XXXX(山)公路。 帕拉姆(name, cb)。XXXX

还有其他一些方便的方法,比如basic(),但你找不到set()或enable()或其他方法来改变更大的应用程序状态。

使用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请求方法。