使用" socket" (不是" io")在Express路线中

时间:2017-02-08 00:05:29

标签: node.js express socket.io

我对io.emit()socket.emit()之间区别的理解是io发送给所有连接的客户端,而socket.emit()仅发送给连接的客户端。

我已经看到了带有快递的模式,您可以将io实例绑定到响应,然后在路由处理程序中使用它......

const io = require('./socket/index')(server);

app.use((req, res, next) => {
    res.io = io;
    next();
});

如何附加"套接字"到请求/响应对象,以便仅向连接的客户端发送 事件?

例如:

app.use((req, res, next) => {

    io.on('connection', (socket) => {
        res.socket = socket;
    });

    next();
});

app.post('/upload', (req, res) => {
    // emits only to the client in question
    res.socket.emit('upload started');
})

3 个答案:

答案 0 :(得分:0)

您需要保留套接字ID

// client
const socket = io.connect($constants.socketUrl,{        
    reconnection:true
});

socket.io将返回一个套接字会话,其中包含一个id

const clientId = socket.id

您需要在某处保留该ID(localStorage,cookies等) 然后在您的服务器中,您需要提供该ID以将消息发送到该特定客户端 socket.io保留一个连接的客户端列表,只需使用它。

//server, maybe you would need to add --> const socketId = "/#" + socketId
//Here is where you use io you passed previously.
io.sockets.connected[socketId].send(msg);

答案 1 :(得分:0)

如果您在var app = express();下的app.js中使用express generator添加以下行

 var server = require('http').Server(app);
 var io = require('socket.io')(server);

现在在app.js的结尾,您将看到module.exports = app;将其更改为

module.exports = {app: app, server: server};

接下来,在编辑器中打开bin / www。更改,var app = require('../ app');进入

var app = require('../app').app;

然后更改var服务器= http.createServer(app);进入

var server = require('../app').server;

打开app.js备份并添加此中间件

app.use(function(req, res, next){
 res.io = io;
 next();
});

现在您可以使用代码发出

/* GET users listing. */
router.get('/', function(req, res, next) {
    res.io.emit("emit", "users");
    res.send('respond with a resource.');
});

答案 2 :(得分:0)

我已经使用socket.io和express generator开发了一个完整的应用程序。请浏览我的博客文章,我也将指向我的存储库的链接添加到我的文章中。

https://medium.com/@mohsinyounas05/configuring-socket-io-with-express-generator-2ce2c778ed68