ChatGPT解决这个技术问题 Extra ChatGPT

Express.js - app.listen 与 server.listen

这可能是一个非常基本的问题,但我根本不明白。使用 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,我会得到相同的输出。

我意识到这个问题很老,但我想指出,createServer 已被贬值。
@PhilipKirkbride 你能提供证据吗?
@PhilipKirkbride 我认为这是一个有点误导性的陈述。 ExpressJS 的 createServer() 方法已被弃用,但 Node.js HTTP 模块仍使用 createServer() 且未弃用。

r
robertklep

如果您想重用 HTTP 服务器,例如在同一个 HTTP 服务器实例中运行 socket.io,则第二种形式(您自己创建一个 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);

但是,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) {
  ...
});

所以 require('http").createServer(require("express")).listen(80) 是 === require("express")().listen(80)?
@user2167582 效果是一样的,是的,但是字面的 === 比较当然会失败;)如果您不相信我,there is always the source
问题与套接字无关,但这就是我来这里的原因
@TannerSummers 我几乎总是使用 app.listen() 因为它需要更少的代码。由于它只是 server.listen() 之上的一个非常薄的层,并且它返回服务器实例,因此通常没有理由手动创建单独的 HTTP 服务器实例。
@Reine_Ran_ 基本上,是的。 app.listen()(Express)将创建一个常规 HTTP 服务器(通过使用 http.createServer());如果你想通过 HTTPS 运行 Express,你需要单独使用 https.createServer() 并将 Express “附加”到它(或使用单独的 HTTPS 服务器,如 nginx 作为 HTTPS 终止符)。
T
Tim

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

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

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

express 的应用程序只会返回 http server,你不能在 express 中设置它,所以你需要使用 https server 命令

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

S
Shalabyer

只是为了准时目的并扩展一点蒂姆的答案。
来自official documentation

express() 返回的应用程序实际上是一个 JavaScript 函数,旨在传递给 Node 的 HTTP 服务器作为处理请求的回调。

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

var https =require('https');
var http = require('http');
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);
};

请在第二段代码上多解释一下。这里的便捷方法到底是什么意思?
@AakashVerma 这只是一段 exress 的源代码,可以在 express/lib/appplication.js 中找到,只不过是创建节点 http 服务器的快捷方式。
所以你的意思是说,当我们通过 express() 作为回调使用 app 时,它会接收来自外部 HTTP 服务器的请求(通过 80 或 443),然后在自身内部创建另一个虚拟服务器 http.Server 并使用它来监听把请求转发给它?
var https = require('https'); var http = require('http');
M
Muhammad Shahzad

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

来自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,请参阅他们的 example

请参阅this

我更喜欢 app.listen() :)


S
Sarim Javaid Khan

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅