Express.js - app.listen vs server.listen

Tam*_*mas 378 node.js express server

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

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

//app.configure, app.use etc

app.listen(1234);
Run Code Online (Sandbox Code Playgroud)

并添加一个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);
Run Code Online (Sandbox Code Playgroud)

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

rob*_*lep 510

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

var express = require('express');
var app     = express();
var server  = require('http').createServer(app);
var io      = require('socket.io').listen(server);
...
server.listen(1234);
Run Code Online (Sandbox Code Playgroud)

但是,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) {
  ...
});
Run Code Online (Sandbox Code Playgroud)

  • @ user2167582效果是一样的,是的,但当然文字`===`比较会失败;)如果你不相信我,[总有来源](https://github.com/strongloop /express/blob/3e4158bcbda7017dbe7226fb76d974bd95c29ce9/lib/application.js#L540). (7认同)
  • 问题与套接字无关,但这完全是我来到这里的原因 (7认同)
  • @TannerSummers 我几乎总是使用`app.listen()`,因为它需要的代码更少。由于它只是`server.listen()` 之上的一个非常薄的层,并且它返回服务器实例,所以通常没有理由手动创建单独的HTTP 服务器实例。 (4认同)
  • 所以require('http“)。createServer(require(” express“))。listen(80)是=== require(” express“)()。listen(80)? (2认同)
  • @Reine_Ran_ 基本上,是的。`app.listen()` (Express) 将创建一个常规 HTTP 服务器(通过使用 `http.createServer()`);如果你想通过 HTTPS 运行 Express,则需要单独使用 `https.createServer()` 并将 Express “附加”到它(或使用单独的 HTTPS 服务器,如 nginx 作为 HTTPS 终止符)。 (2认同)

Tim*_*Tim 54

当您要为https服务器设置时,使用应用程序和监听http服务器的另一个区别

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

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

来自express的app只会返回http服务器,你不能在express中设置它,所以你需要使用https服务器命令

var express = require('express');
var app = express();
app.listen(1234);
Run Code Online (Sandbox Code Playgroud)


Iva*_*aev 23

只是为了准时的目的,并延长一点蒂姆答案.
官方文件:

express()返回的应用程序实际上是一个JavaScript函数, 设计为通过Node的HTTP服务器作为处理请求的回调.

这样可以轻松地为应用程序的HTTP和HTTPS版本提供相同的代码库,因为应用程序不会从这些版本继承(它只是一个回调):

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
Run Code Online (Sandbox Code Playgroud)

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

app.listen = function() {
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};
Run Code Online (Sandbox Code Playgroud)

  • 请再解释一下第二段代码。这里的便捷方法究竟是什么意思? (3认同)
  • @AakashVerma 这只是 exress 的一段源代码,可以在 `express/lib/appplication.js` 中找到,只不过是创建节点的 http 服务器的快捷方式。 (2认同)

Sar*_*han 7

Express基本上是http模块的包装器,它是为了方便开发人员而创建的.

  1. 他们可以使用express设置中间件以响应HTTP请求(轻松).
  2. 他们可以基于使用express将参数传递给模板来动态呈现HTML页面.
  3. 他们还可以使用express轻松定义路由.


Muh*_*zad 5

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

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);
};
Run Code Online (Sandbox Code Playgroud)

另外,如果您想使用socket.io,请参见他们的示例

看到这个

我更喜欢app.listen():)