我在一个中间件 (function(req, res, next) {...}
) 中。
有没有一种方法可以从 req
访问 HTTP 服务器对象?
更新
让我更加具体。我试图找出服务器侦听的端口,或者如果它正在侦听,则为Unix套接字路径。
在您的主应用程序文件中怎么样:
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。请看一下我的答案。 - verybadallocvar httpServer = http.createServer(); httpServer.on('request', app);
- Dominic如果你想在路由器中公开服务器对象,那么中间件确实是可行的方式:
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
});
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出于某些原因,对我而言 request.app.server
无法使用,可能是由于我在使用 express 4,经过一番挖掘,我发现 req.socket.server
是可行的。
console.log(req)
,其中一个属性引用了服务器。它没有被记录下来,可能会在未来发生变化,但是它确实存在。我不知道这个属性的名称,因为我手头没有Node,抱歉。 - Brad