我遇到过像这样的代码
express = require('express');
app = express();
app.use(require('./lib/file.js'));
app.listen(80);
包含
的file.jsexpress = 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()
行是如何工作的吗?
答案 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
)。