在node.js express中访问HTTP服务器对象

17

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

有没有一种方法可以从 req 访问 HTTP 服务器对象?

更新

让我更加具体。我试图找出服务器侦听的端口,或者如果它正在侦听,则为Unix套接字路径。


有一个属性。如果你执行console.log(req),其中一个属性引用了服务器。它没有被记录下来,可能会在未来发生变化,但是它确实存在。我不知道这个属性的名称,因为我手头没有Node,抱歉。 - Brad
4个回答

19

在您的主应用程序文件中怎么样:

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 未定义: http://expressjs.com/api.html#req.params。请看一下我的答案。 - verybadalloc
经过测试,它确实有效。另外还有一个额外的好处,允许您将路由/中间件与主文件分离,而您的答案则不允许这样做。 - srquinn
刚看到 Brad 的评论,你是对的,它可以工作。但这不是文档化的。 - verybadalloc
或者 var httpServer = http.createServer(); httpServer.on('request', app); - Dominic

8

如果你想在路由器中公开服务器对象,那么中间件确实是可行的方式:

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
});

6

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

源代码 express/lib/application.js

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

既然你提到了,我也在文档中发现了它:app.listen()方法返回一个http.Server对象... http://expressjs.com/de/4x/api.html#app.listen - ThomasR

4

出于某些原因,对我而言 request.app.server 无法使用,可能是由于我在使用 express 4,经过一番挖掘,我发现 req.socket.server 是可行的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接