Express.js-app.listen与server.listen


439

这可能是一个非常基本的问题,但我根本不明白。使用Express.js创建应用程序和在端口1234上启动应用程序侦听之间有什么区别,例如:

var express = require('express');
var app = express();

//app.configure, app.use etc

app.listen(1234);

并添加http服务器:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

//app.configure, app.use etc

server.listen(1234);

有什么不同?
如果导航到http://localhost:1234,则得到相同的输出。


25
一段时间以来一直在想自己这个问题...好问题!
Stijn de Witt

2
我意识到这个问题很旧,但是我想指出,createServer已被贬值。
菲利普·柯比布莱德

@PhilipKirkbride您能提供证明吗?
yanot

12
@PhilipKirkbride我认为这是一个令人误解的陈述。ExpressJS的createServer()方法已被弃用,但Node.js HTTP模块仍使用createServer(),但尚未弃用。
塔马斯

Answers:


562

第二种形式(您自己创建一个HTTP服务器,而不是让Express为您自己创建一个HTTP服务器)在您想重用HTTP服务器(例如socket.io在同一个HTTP服务器实例中运行)时非常有用:

var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(1234);

但是,app.listen()还会返回HTTP服务器实例,因此,只需进行一些重写,您就可以实现类似的操作,而无需自己创建HTTP服务器:

var express   = require('express');
var app       = express();

// app.use/routes/etc...

var server    = app.listen(3033);
var io        = require('socket.io').listen(server);

io.sockets.on('connection', function (socket) {
  ...
});

2
因此require('http“)。createServer(require(” express“))。listen(80)是=== require(” express“)()。listen(80)?
user2167582 2014年

7
@ user2167582的效果是一样的,是的,但是字面===比较当然会失败;)如果您不相信我,总会有消息来源
robertklep 2014年

1
var socketio = require('socket.io')在你需要重写第三行?
davidx1

1
每个利弊?
Tanner Summers

2
我实际上经常使用@TannerSummers,app.listen()因为它需要更少的代码。由于它只是之上的非常薄的一层server.listen(),并且它返回服务器实例,因此通常没有理由手动创建单独的HTTP服务器实例。
robertklep

64

当您要为https服务器设置时,使用该应用程序和收听http服务器还有另外一个区别

要设置https,您需要以下代码:

var https = require('https');
var server = https.createServer(app).listen(config.port, function() {
    console.log('Https App started');
});

express中的应用程序将仅返回http服务器,您无法在express中对其进行设置,因此需要使用https server命令

var express = require('express');
var app = express();
app.listen(1234);

30

仅出于守时的目的,请添添一点答案。
根据官方文件

通过快递()返回该应用程序实际上是一个JavaScript函数, DESIGNED传递到节点的HTTP服务器作为一个回调来处理请求。

这使为应用程序的HTTP和HTTPS版本提供相同的代码库变得容易,因为该应用程序不继承自这些代码(它只是回调):

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

所述app.listen()方法返回的http.Server对象和(对于HTTP)是一个方便的方法用于以下情况:

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

1
请在第二段代码中进一步解释。这里的便捷方法到底是什么意思?
Aakash Verma

@AakashVerma这只是exress的一部分源代码,可以在其中找到,express/lib/appplication.js而无非就是创建节点的http服务器的快捷方式。
伊万·塔拉拉耶夫

因此,您的意思是说,当我们通过express()使用app作为回调时,它将接收来自外部HTTP服务器的请求(通过80或443),然后在其内部创建另一个虚拟服务器http.Server并使用它来侦听将请求转发给吗?
Aakash Verma

10

我遇到了同样的问题,但是在谷歌之后,我发现并没有太大的区别:)

Github

如果您希望同时创建HTTP和HTTPS服务器,则可以使用“ http”和“ https”模块,如下所示。

/**
 * 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():)


9

Express基本上是http模块的包装,它是为了使开发人员易于使用而创建的。

  1. 他们可以设置中间件以使用express轻松响应HTTP请求。
  2. 他们可以使用express将参数传递给模板,从而动态呈现HTML页面。
  3. 他们还可以使用express轻松定义路由。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.