它们有何不同
每个人,包括文档,都倾向于回顾它们有多少相同之处,但实际上并没有提及任何差异。事实上,它们是不同的。
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()或其他方法来改变更大的应用程序状态。