【问题标题】:How to handle HTTP upgrade in ExpressJS?如何处理 ExpressJS 中的 HTTP 升级?
【发布时间】:2015-02-23 03:32:12
【问题描述】:

最新的 ExpressJS 不再从 http.Server 继承。

如果我尝试侦听upgrade 事件,服务器将回复404 Not Found

当前[简化]代码是:

app.on('upgrade', function(req, socket, head) { /* ... */ });

如果我尝试在 Google 上搜索答案,我只会找到与“3.0 -> 4.0 express upgrade”相关的链接,而不是 HTTP 升级

编辑:

应@jfriend00 的要求,我的快速初始化[简化]代码:

app = express.createServer();
app.listen(self.port, self.ipaddress);

【问题讨论】:

  • 我认为 Express 从未从 http 服务器继承。它为您的服务器提供请求侦听器。如果您在 Express app 对象上调用 .listen(),它将为您创建一个 http.Server,如下所示:var server = http.createServer(this);。因此,您关于不使用 http.Server 的假设似乎是错误的。您应该能够在 http 服务器对象上使用 this technique 来监听升级事件。
  • 请显示您的 express 初始化代码,以便我们指导您如何使用 http 服务器对象而不是 Express 对象来执行此操作。
  • express.createServer() 已被弃用很长时间,并已从 Express 4 中删除。您可以使用 var app = express() 在 Express 4 中创建 app 对象。如果您需要直接访问 http 服务器对象,则从 var server = app.listen(...) 返回 http 服务器对象。您使用的是哪个版本的 Express?
  • 几秒前我升级到 ExpressJS 4.11.2。进行了您提到的更改后,它仍然无效。 upgradeing 对 app.listen 返回的对象似乎不起作用。而且我仍然看到 ExpressJS 注入的像 X-Powered-By:"Express" 这样的标头。
  • 抱歉,我们看不到的代码很难评论。如果您使用的是 Express,我不知道您为什么会惊讶地看到 Express 标头。

标签: node.js express


【解决方案1】:

由于我的评论似乎对你有用,我会把它放在答案中。

express.createServer() 已被弃用很长时间,并已从 Express 4 中删除。您将在 Express 4 中创建应用对象:

var app = express()

然后从返回http服务器对象

var server = app.listen(...)

如果您需要直接访问 http 服务器对象。

【讨论】:

    【解决方案2】:

    使用 express 应用创建 HTTP 服务器:

    const app = express()
    
    const server = http.createServer(app);
    
    server.on('upgrade', function (req, socket, head) {
      // ...
    });
    
    server.listen(5000);
    

    https://github.com/expressjs/express/issues/2556#issuecomment-75310480

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-25
      • 2011-07-19
      • 2021-07-14
      • 2023-04-09
      • 2014-11-24
      • 1970-01-01
      • 2020-11-18
      • 2011-01-25
      相关资源
      最近更新 更多