如何从快递应用程序获取http.server?

Gra*_*row 9 javascript node.js express socket.io

我正在编写一个服务器端node.js应用程序,它使用express来处理HTTP请求,我正在添加websockets(socket.io)支持.但是,我无权访问启动HTTP服务器的代码.我正在编写一个快速路由器和函数来处理各种URL.我的代码看起来像:

var express = require('express');
var router = express.Router();
router.post( myURL, myFunction );
Run Code Online (Sandbox Code Playgroud)

在设置路由器时,我想使用socket.io来监听websocket连接.我无法传递expressexpress()进入require('socket.io')( xxx ),我需要传递http.Server对象.但由于我没有启动服务器,我怎么能得到它?

jfr*_*d00 23

据我所知,Express app对象不知道服务器对象.在Express中工作的方式,app对象被赋予服务器对象,而不是相反.

您可以从请求处理程序中访问服务器对象app,但是它来自服务器,作为请求的上下文的一部分,这不是req.connection.server对象本身知道的东西.

因此,如果要在初始化时访问服务器对象以与socket.io一起使用,则必须将服务器对象捕获到创建它的变量中.

您在问题中显示的代码不会创建或启动服务器.启动服务器以使用Express的通常两种方法是:

var express = require('express');
var app = express();
// Express creates a server for you and starts it
var server = app.listen(80);
Run Code Online (Sandbox Code Playgroud)

或者,您自己创建服务器并将express作为处理程序传递给它:

var express = require('express');
var app = express();
// you explicitly create the http server
var server = require('http').createServer(app);
server.listen(80);
Run Code Online (Sandbox Code Playgroud)

在每种情况下,您最终都会在变量中使用服务器对象,然后可以将其与socket.io一起使用.


您可以在处理来自传递给请求处理程序的对象appreq对象的请求中从Express路由处理程序内部访问服务器.

res.connection.server
req.connection.server
Run Code Online (Sandbox Code Playgroud)


Bra*_*rad 7

调用时将返回服务器app.listen()。例如:

const server = app.listen(process.env.NODE_PORT, () => {
  console.log('Listening', server.address());
});
Run Code Online (Sandbox Code Playgroud)


Ada*_*eis 5

您可以编写一个简单的包装器来实例化或获取 Express 应用程序中的 Socket IO 实例,方法是将以下内容放入某个文件中:

//Dependencies
const socketIo = require('socket.io');

//Placeholder for instance
let io;

//Export handler to instantiate or get instance
module.exports = function(server) {
  if (server) {
    io = socketIo(server);
  }
  return io;
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以在设置 Express 时以通常的方式实例化此实例:

const app = require('express')();
const server = require('http').Server(app);
const io = require('./path-to-your-file')(server);
Run Code Online (Sandbox Code Playgroud)

当您稍后在其他地方的路线或代码中需要它时,您可以按如下方式获取它:

const io = require('./path-to-your-file')();
Run Code Online (Sandbox Code Playgroud)

这当然是一个简化的示例,但您可以修改逻辑以满足您的需要。