所有
我是Express.js和Socket.io的新手,当我在Socket.io网站上尝试聊天示例时,它有一些代码:
var app = require('express')();
var http = require('http').Server(app);
app.get('/', function(req, res){
res.send('<h1>Hello world</h1>');
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
在Express.js网站上,它有一些代码:
var express = require('express');
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;
console.log('Example app listening at http://%s:%s', host, port);
});
令我困惑的是:
在socket.io中,它使用http Server包装应用程序来构建服务器,而在Express中,它直接使用该应用程序作为服务器,两个服务器都工作。我想知道为什么以及什么是差异呢?
由于
答案 0 :(得分:2)
如您所见,这两个选项都将创建一个服务器。不同之处在于创建服务器的位置以及如何访问服务器。
在第一个示例中使用http模块创建服务器,服务器在express之外创建。您可以通过将服务器传递给socket.io(或其他任何需要服务器的服务器)来从http访问服务器。
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
io.on(...);
使用Express版本,Express会创建服务器。您仍然可以使用app.listen访问服务器实例,这就像require(&#39; express&#39;)()。listen()。 Io可以像这样得到服务器实例:
var app = require('express')();
var io = require('socket.io').listen(app.listen(80));
内部表达在其app.listen函数中调用http.createServer:
在下载express的node_modules目录中,有一个名为/node_modules/express/lib/application.js的文件。 这是listen方法的地方。当你运行var app = require(&#39; express&#39;)()时,app.listen来自文件的这一部分:
/**
* Listen for connections.
*
* A node `http.Server` is returned, with this
* application (which is a `Function`) as its
* callback. If you wish to create both an HTTP
* and HTTPS server you may do so with the "http"
* and "https" modules as shown here:
*
* var http = require('http')
* , https = require('https')
* , express = require('express')
* , app = express();
*
* http.createServer(app).listen(80);
* https.createServer({ ... }, app).listen(443);
*
* @return {http.Server}
* @api public
*/
app.listen = function(){
var server = http.createServer(this);
return server.listen.apply(server, arguments);
};
(在评论中,他们建议使用socket.io用于创建多个服务器的类似方法。)
看着它,它显示了app.listen如何构建服务器。其他应用程序属性(此处未显示)是针对http.Server附带的额外帮助程序,如app.use,app.configure和app.render。
请注意,http.createServer在实例化对象方面与http.Server不同。我们可以在这里考虑它们。