Node.js 在express应用程序中调用两次app变量

Node.js 在express应用程序中调用两次app变量,node.js,express,routes,Node.js,Express,Routes,我有一个文件,其中我调用了所有名为'app.js'的require模块 var express = require('express'); ... var app = express(); ... var routes = require('ruotes/index.js) use('/', routes); module.exports = app; 我调用index.js,在那里我有所有的路由 routes/index.js var express = require('expr

我有一个文件,其中我调用了所有名为'app.js'的require模块

var express = require('express');
...
var app = express();

...

var routes = require('ruotes/index.js)

use('/', routes);

module.exports = app;
我调用
index.js
,在那里我有所有的路由

routes/index.js

var express = require('express');
var app = express();

/* import controllers */
var indexController = require('../controllers/index');

app.route('/')
   .get(indexController.index);

module.exports = app;

问题是我有两个变量叫做
app
,我调用了两次
express()
。是否存在一种更优雅的方式来处理这种情况?也许我可以用另一种方式调用路由器文件中的变量?

您目前正在使用一种称为子装载的技术

如果您想避免创建不同的Express实例,则必须将唯一的Express实例作为参数传递给路由器,这意味着您的
index.js
需要导出一个函数,该函数接受您的应用程序作为参数

比如:

//=== routes/index.js

/* import controllers */
var indexController = require('../controllers/index');



module.exports = function(app){
    app.route('/').get(indexController.index);
};
这样做将允许您在整个Web应用程序中保留相同的Express实例。 由于您在
index.js
中导出了一个函数,因此需要在
app.js
中调用它

var express = require('express');
...
var app = express();

...

var routes = require('routes/index.js)(app)

module.exports = app;
您可以对路由、模块、模型等使用相同的技术。。。
这种技术将允许您避免重新要求模块和实例化模块,但您需要写入额外的位,以确保将变量从应用程序的一端传递到另一端。因此,有些人更喜欢使用子安装技术,只在需要模块的地方才需要模块。

谢谢。很好的例子和简单的解释我真的不明白增加复杂性的必要性。如果require()是内置在您所使用的语言中的依赖系统,为什么要避免调用它呢。它缓存了这些值,因此不会损失性能,但这些伪DI方法会损失性能(我目前正在调试一些继承代码中由此导致的mean.io错误)