4

我遇到过这样的代码

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()条线是如何工作的吗?

4

2 回答 2

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

于 2013-08-09T16:43:59.303 回答
1
app = module.exports = express()

也可以写成:

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

因此,它将模块导出设置为 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;
};

基本上,这是将路线放在单独文件中的一种方法(在这种情况下file.js)。

于 2013-08-09T16:35:46.823 回答