【问题标题】:access to HTTP server object in node.js express在 node.js express 中访问 HTTP 服务器对象
【发布时间】:2013-12-31 04:25:05
【问题描述】:

我在中间件中 (function(req, res, next) {...})。

有没有办法从req 访问HTTP 服务器对象?

更新

让我更具体一点。我正在尝试找出服务器侦听的端口或 unix 套接字路径(如果它正在侦听)。

【问题讨论】:

  • 有。如果您执行console.log(req),则其中一个属性会引用服务器。它没有记录在案,将来可能会改变,但它就在那里。我不知道该属性的名称,因为我手边没有 Node,抱歉。

标签: node.js express


【解决方案1】:

在你的主应用文件中怎么样:

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

app.use(app.router);

app.get('/', function (req, res, next) {
  console.log(req.socket.server);
});

app.server = http.createServer(app);
app.server.listen(3000);

正如 Brad 所提到的,Express 确实公开了类似于从 #createServer() 返回的对象的内容,但是,TJ 一直在认真考虑在未来版本中删除任何包含在 express 中的 HTTP 模块。使用上面的代码将是未来安全的。

【讨论】:

  • 我很确定这不会起作用,因为 req.app 未定义:expressjs.com/api.html#req.params。请看我的回答
  • 经过测试,确实有效。还有一个额外的好处是允许您将您的路由/中间件从您的答案不允许的主文件中分离出来。
  • 刚看到布拉德的评论;你是对的,它会起作用的。但它是无证的。
  • var httpServer = http.createServer(); httpServer.on('request', app);
【解决方案2】:

如果您想要做的是在路由器中公开服务器对象,那么是的,中间件是可行的方法:

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

app.use(function(req, res, next){ //This must be set before app.router
   req.server = server;
   next();
});

app.use(app.router); 

server.listen(3000);

中间件用于暴露服务器对象。然后,您可以像这样在任何路由器中访问它:

app.get('/', function (req, res, next) {
  console.log(req.server.get('port')); // displays 3000
});

【讨论】:

    【解决方案3】:

    函数 app.listen 返回您的 http 服务器。

    来源 express/lib/application.js

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

    【讨论】:

    【解决方案4】:

    由于某种原因,request.app.server 对我来说不起作用,可能是因为我使用的是 express 4,经过一番挖掘,我发现 req.socket.server 起作用了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 2013-01-23
      相关资源
      最近更新 更多