导出快速实例的工作原理如何

时间:2013-08-09 16:28:24

标签: 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){});
//And so on..

有人可以解释app = module.exports = express()行是如何工作的吗?

2 个答案:

答案 0 :(得分:2)

首先,这会将当前模块的导出设置为与express应用程序实例相同。

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应用程序实例,然后让其中一个实例侦听另一个实例。

答案 1 :(得分:1)

app = module.exports = express()

也可以写成:

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

因此它将模块导出设置为快速应用程序的实例(反过来,它是connect应用程序)。

有趣的部分是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;
};

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