Asp.net mvc 导出express实例是如何工作的

Asp.net mvc 导出express实例是如何工作的,asp.net-mvc,express,Asp.net Mvc,Express,我遇到过这样的代码 express = require('express'); app = express(); app.use(require('./lib/file.js')); app.listen(80); 其中file.js包含 express = require('express'); app = module.exports = express(); app.get('/blah', function(a,b){}); app.post('/blah', function(a,b

我遇到过这样的代码

express = require('express');
app = express();
app.use(require('./lib/file.js'));
app.listen(80);
其中file.js包含

express = require('express');
app = module.exports = express();
app.get('/blah', function(a,b){});
app.post('/blah', function(a,b){});
//And so on..
有人能解释一下
app=module.exports=express()
行是如何工作的吗

app = module.exports = express()
也可以写成:

app = express()
app.get('/blah', function(a,b){});
app.post('/blah', function(a,b){});
module.exports = app
因此,它将模块导出设置为express应用程序的实例(而express应用程序又是一个应用程序)

有趣的部分是app.use(require('./lib/file.js'),基本上将导出的应用程序设置为连接中间件。这是可能的,因为连接应用程序实际上是可以用作中间件的函数。通过查看创建它们的代码,您可以清楚地看到:

function createServer() {
    //the magic happens in the next line:
    function app(req, res, next){ app.handle(req, res, next); } 
    utils.merge(app, proto);
    utils.merge(app, EventEmitter.prototype);
    app.route = '/';
    app.stack = [];
    for (var i = 0; i < arguments.length; ++i) {
        app.use(arguments[i]);
    }
    return app;
};
函数createServer(){
//魔术发生在下一行:
函数app(req,res,next){app.handle(req,res,next);}
utils.merge(app,proto);
合并(app,EventEmitter.prototype);
app.route='/';
app.stack=[];
对于(变量i=0;i

基本上,这是将路由放在单独文件中的方法之一(在本例中为
file.js
)。

首先,这将当前模块的导出设置为与express app实例相同

module.exports = express(); 
该行的这一部分只是为module.exports创建了一个本地别名

app = module.exports
您找到的文件也可以按照以下方式编写,不需要别名“app”以获得视觉美感

express = require('express');
module.exports = express();
module.exports.get('/blah', function(a,b){});
module.exports.post('/blah', function(a,b){});

另外,请注意,在两个文件中包含所有这些内容有点多余。应用程序正在创建两个express app实例,然后让其中一个实例侦听另一个实例

您建议使用什么来代替两个express实例?@mgoszcz2您可以让模块导出一个函数,该函数以主应用程序为参数,“enriches”带有路由,然后在主模块中调用它。我真的不太担心额外的实例。我同意@soulcheck,这不是问题。我只是指出了这一点,因为它并不常见,我想帮助说明express是如何工作的。在我们的节点应用程序中,我们倾向于只传递应用程序实例来路由模块。因此,我们有一个“routes”目录,其中的模块用于组织不同的相关路由。我们只需要每个路由模块,并将singleton express应用程序实例传递给每个模块。在内部,模块只是附加它们的路径。@AnthonyHildoer子应用程序是构建Express.js项目的非常常见的方法。我使用你的方式和子应用程序。子应用的主要缺点是它们不与其他应用共享视图。这部分是由于res.render和Jade卡在一个目录中。因此,如果您的项目中有一部分有自己的视图或根本不使用视图,那么子应用程序是一个非常好的抽象方法。@Pickels这是一个有趣的用法。我想到的第一件事是与Apache的虚拟主机类似的东西,在很多Node.js模块中都会看到类似的东西。不知道为什么人们不把
module.exports=app在其模块代码的末尾。