背景
最近敬扛,遇到一個問題需要在express
路由中操作socket
垦垂,而網(wǎng)上的例子基本上是在主文件操作socket
拜英。
基本思路
給router
添加一個io
函數(shù)接校,接收參數(shù)io
(io
是引入的socket.io
庫)熟掂。
// routes/chat.js
var express = require('express');
var router = express.Router();
var IO = null;
router.io = function(io) {
io.on('connection', (socket) => {
socket.on('message', (data) => {
// 操作data
})
});
IO = io;
return io;
}
router.post('/xxx', (req, res) => {
// 下面通過IO操作socket苔严,具體socket操作請自行查看文檔
// 以下是例子
IO.sockets.in(Id).emit('xxx', {
...
})
})
module.exports = router;
咱把router
導(dǎo)出际度,在app.js
中導(dǎo)入工秩,然后把router.io
賦給app.io
云稚。
// app.js
var express = require('express');
var chatRouter = require('./routes/chat');
var app = express();
app.io = chatRouter.io; // 現(xiàn)在app.io是一個函數(shù)隧饼,可以接收socket.io
...
app.use('/chat', chatRouter);
module.exports = app;
最后,在bin/www
中導(dǎo)入socket.io
并調(diào)用app.io
静陈。
// bin/www
var app = require('../app');
var http = require('http');
...
var server = http.createServer(app);
var io = require('socket.io')(server);
app.io(io);
現(xiàn)在chat.js
中的router.io
成功接收到導(dǎo)入的socket
燕雁。
可能有人會有疑惑,怎么不直接在chat.js
中直接導(dǎo)入socket.io
?
socket.io基于http
用express-generator
生成的express
項目鲸拥,目錄結(jié)構(gòu)如下
http
模塊是在bin/www
下導(dǎo)入并生成server
拐格,而socket.io
基于http
(socket.io的參數(shù)就是server),所以網(wǎng)上的示例大多數(shù)是寫在該文件里刑赶。
// bin/www
var app = require('../app');
var http = require('http');
var port = normalizePort('8080');
app.set('port', port);
var server = http.createServer(app);
var io = require('socket.io')(server); // 注意這里的參數(shù)
...
如果對你有幫助捏浊,請給個?。