当require(“http”)。Server()以Express应用程序作为参数进行评估时,会发生什么情况?

我正在读这里的Socket.io聊天演示: http ://socket.io/get-started/chat/,当我看到他们的require语句时,我感到困惑。

var app = require('express')(); var http = require('http').Server(app); var io = require('socket.io')(http); app.get('/', function(req, res){ res.sendfile('index.html'); }); io.on('connection', function(socket){ console.log('a user connected'); }); http.listen(3000, function(){ console.log('listening on *:3000'); }); 

我正确地认为require("express")产生一个可执行的Express函数(带有所有必要的函数和字段),并且require("http").Server(app)创build一个http.Server对象与所有的领域和function。

如果是这样的话,我很困惑,因为Express在我们调用.listen函数的时候创build了一个服务器,所以看起来是多余的,而且是向后传递一个Express应用程序到一个http模块服务器。

所以,我的问题是,这里发生了什么?

http服务器需要一个具有以下签名的函数:

function(req, res)

require('express')(); 将创build一个函数,该函数处理所有的expression式,例如路由,中间件等等.Express 可以创build它自己的http服务器实例,但是由于您也使用了socket.io(期望访问http服务器以及),你将需要一个单独的http实例。

 var app = require('express')(); //infact, app is a requestListener function. var http = require('http').Server(app); // infact, function Server eqs http.createServer; // infact,app.listen eqs http.listen 

来自nodejs和express模型的其他代码

我们可以看到,require(“express”)()返回app是一个函数。

 //express/lib/express.js https://github.com/strongloop/express/blob/master/lib/express.js var proto = require('./application'); exports = module.exports = createApplication; function createApplication() { var app = function(req, res, next) { app.handle(req, res, next); }; mixin(app, EventEmitter.prototype, false); mixin(app, proto, false); app.request = { __proto__: req, app: app }; app.response = { __proto__: res, app: app }; app.init(); return app; } 

我们可以看到,node.createServer eqs Server

 //nodejs/lib/http.js https://github.com/nodejs/node/blob/master/lib/http.js exports.createServer = function(requestListener) { return new Server(requestListener); }; 

我们可以看到,表示app.listen eqs http.listen

 //express/lib/application.js https://github.com/strongloop/express/blob/master/lib/application.js app.listen = function listen() { var server = http.createServer(this); return server.listen.apply(server, arguments); }; //nodejs/lib/_http_server.js https://github.com/nodejs/node/blob/master/lib/_http_server.js function Server(requestListener) { if (!(this instanceof Server)) return new Server(requestListener); net.Server.call(this, { allowHalfOpen: true }); if (requestListener) { this.addListener('request', requestListener); } this.httpAllowHalfOpen = false; this.addListener('connection', connectionListener); this.addListener('clientError', function(err, conn) { conn.destroy(err); });