混淆Express API来构建App服务器

时间:2015-12-17 17:51:11

标签: node.js sockets express

所有

我是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中,它直接使用该应用程序作为服务器,两个服务器都工作。我想知道为什么以及什么是差异呢?

由于

1 个答案:

答案 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不同。我们可以在这里考虑它们。