【问题标题】:Express.js - app.listen vs server.listenExpress.js - app.listen 与 server.listen
【发布时间】:2013-07-15 19:54:53
【问题描述】:

这可能是一个非常基本的问题,但我就是不明白。使用 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() 并且已弃用。

标签: node.js express server


【解决方案1】:

只是为了准时目的,并扩展一点蒂姆的答案。
来自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。服务器本身并使用它来监听转发给它的请求?
  • var https = require('https'); var http = require('http');
【解决方案2】:

如果您想重用 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
  • 问题与套接字无关,但这完全是我来这里的原因
  • var socketio = require('socket.io') 在你重写的第三行吗?
  • @TannerSummers 我几乎总是使用app.listen(),因为它需要的代码更少。由于它只是server.listen() 之上的一个非常薄的层,并且它返回服务器实例,因此通常没有理由手动创建单独的 HTTP 服务器实例。
【解决方案3】:

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

来自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() :)

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-23
        • 1970-01-01
        • 2014-08-19
        • 2018-07-11
        • 1970-01-01
        • 1970-01-01
        • 2016-01-18
        相关资源
        最近更新 更多