如何结合 Express.JS 使用 Socket.io(使用 Express 应用程序生成器)

Posted

技术标签:

【中文标题】如何结合 Express.JS 使用 Socket.io(使用 Express 应用程序生成器)【英文标题】:How to use Socket.io combined with Express.JS (using Express application generator) 【发布时间】:2017-04-06 11:32:11 【问题描述】:

我正在尝试将 Socket.io 与 Express.JS 结合使用(使用 Express 应用程序生成器)。 我发现了一些如何做到这一点 (Using socket.io in Express 4 and express-generator's /bin/www)。我的问题是我无法使用路由文件夹中的套接字。 我可以在 app.js 和 bin/www.js 文件中使用它们。当我调用路由 index.js 时,它只会长时间加载网页而不会出现任何错误。bin/www.js

...
/**
 * Create HTTP server.
 */

var server = http.createServer(app);

var io     = app.io
io.attach( server );
...

app.js

...
// Express
var app = express();

// Socket.io
var io = socket_io();
app.io = io;
var routes = require('./routes/index')(io);
...

routes/index.js

module.exports = function(io) 
    var app = require('express');
    var router = app.Router();

    io.on('connection', function(socket) 
        console.log('User connected');
    );

    return router;

【问题讨论】:

下面我的回答对你有帮助吗?有cmets吗?如果它对您有帮助,那么您可以考虑 accepting the answer,以便其他搜索它的人可以看到它有一个可接受的答案。 【参考方案1】:

这是一个简单的示例,说明如何将 Socket.io 与 Express 一起使用,我在 GitHub 上提供了该示例:

https://github.com/rsp/node-websocket-vs-socket.io

后端代码是这样的:

var path = require('path');
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', (req, res) => 
  console.error('express connection');
  res.sendFile(path.join(__dirname, 'si.html'));
);
io.on('connection', s => 
  console.error('socket.io connection');
  for (var t = 0; t < 3; t++)
    setTimeout(() => s.emit('message', 'message from server'), 1000*t);
);
http.listen(3002, () => console.error('listening on http://localhost:3002/'));
console.error('socket.io example');

见https://github.com/rsp/node-websocket-vs-socket.io/blob/master/si.js

正如您在此处看到的,我正在创建 express 应用程序:

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

然后我使用该应用程序创建一个 http 服务器:

var http = require('http').Server(app);

最后我使用那个 http 服务器来创建 Socket.io 实例:

var io = require('socket.io')(http);

运行后:

http.listen(3002, () => console.error('listening on http://localhost:3002/'));

这一切都可以协同工作。

您可以在 GitHub 上查看整个示例,其中后端和前端代码都可以使用。它目前使用 Express 4.14.0 和 socket.io 1.4.8。

【讨论】:

如果我正确理解您的回答,我们可以将套接字、io 事件 && http 请求结合到同一个 node-express 服务器?【参考方案2】:

适用于仍想使用 socket.io 并表达 http 请求的任何人。最简单的方法是创建两个单独的 http 服务器实例到不同的端口。 1 个用于 websocket,第 2 个用于 api 请求。

const express = require("express");
const app = express();
const httpServer = require("http").createServer(app);
const io = require("socket.io")(httpServer, 
    path: '/'
);

// routes and io on connection

httpServer.listen(5000, () => 
   console.log("Websocket started at port ", 5000)
);

app.listen(3000, () =>
   console.log("Http server listening at", 3000)
)

【讨论】:

以上是关于如何结合 Express.JS 使用 Socket.io(使用 Express 应用程序生成器)的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Express JS 服务器使 React JS 和 Socket IO 连接在一起?

Express.js 'socket.io/socket.io.js 404'

如何使用 Express、AngularJS、Socket.io 广播和获取通知?

没有 express.js 的 Socket.io 会话?

在 Express.js 项目中使用 Socket.io

使用 express.js 和 socket.io 构建推送通知系统的最佳方法