Nodejs socket.io在express中,怎么把io传到routes/index.js里去?
Nodejs socket.io在express中,怎么把io传到routes/index.js里去?
这是app里的
var server = http.createServer(app);
var socket = io.listen(server);
server.listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});
socket.on('connection', function (socket) {
socket.emit('news', { hello: 'world' });
socket.on('message', function (data) {
console.log(data);
});
//断开连接callback
socket.on('disconnect', function () {
console.log('Server has disconnected');
});
});
这是routes下的index.js
/*
* GET home page.
*/
exports.index = function (req, res) {
res.render('index', { title: 'Express' });
};
为了将 socket.io
的实例 io
传递到 routes/index.js
中,你需要确保在 Express 应用启动时创建 io
实例,并将其作为全局变量或通过其他方式传递给路由处理函数。以下是一个简单的示例,展示如何实现这一点:
在 app.js
中创建并导出 io
首先,修改 app.js
文件,创建 io
实例并导出它。
// app.js
const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const path = require('path');
const app = express();
const server = http.createServer(app);
const io = socketIo(server);
// 导出 io 实例
module.exports = { app, server, io };
server.listen(app.get('port'), () => {
console.log(`Express server listening on port ${app.get('port')}`);
});
io.on('connection', (socket) => {
console.log('A user connected');
socket.emit('news', { hello: 'world' });
socket.on('message', (data) => {
console.log(data);
});
// 断开连接回调
socket.on('disconnect', () => {
console.log('User disconnected');
});
});
在 routes/index.js
中使用 io
接下来,在 routes/index.js
中导入 io
并使用它。
// routes/index.js
const express = require('express');
const router = express.Router();
// 导入 io 实例
const { io } = require('../app');
router.get('/', (req, res) => {
// 将 io 实例传递给模板
res.render('index', { title: 'Express', io });
});
module.exports = router;
在模板中使用 io
最后,在你的 EJS 模板文件(例如 views/index.ejs
)中使用 io
实例来设置客户端的 Socket.IO 连接。
<!-- views/index.ejs -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title><%= title %></title>
<script src="/socket.io/socket.io.js"></script>
<script>
const io = <%= io %>;
const socket = io.connect();
socket.on('news', (data) => {
console.log(data);
socket.emit('my other event', { my: 'data' });
});
</script>
</head>
<body>
<h1>Welcome to the Express App</h1>
</body>
</html>
通过这种方式,你可以将 socket.io
的 io
实例从服务器端传递到客户端,并在客户端建立 WebSocket 连接。
客户端js中
var socket = io.connect();
socket.on('news', function (data) {
console.log(data);
socket.emit('message', "hello ");
});
不是指客户端,是index.js文件,
现在socket都写在app.js里面,我想写在index.js文件里。
app.js
require(routes/index.js)(socket);
index.js
exports.index = function (socket) {
};
var express = require('express')
, io = require('socket.io')
, routes = require('./routes')
, http = require('http')
, user = require('./routes/user')
, path = require('path')
, partials = require('express-partials');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(partials());
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.get('/', routes.index);
app.get('/users', user.list);
app.get('/users/:id?', user.list);
var server = http.createServer(app);
var socket = io.listen(server);
server.listen(app.get('port'), function () {
console.log('Express server listening on port ' + app.get('port'));
});
socket.on('connection', function (socket) {
socket.emit('system', { msg: '欢迎来到聊天室!' });
socket.on('message', function (data) {
console.log(data);
});
//断开连接callback
socket.on('disconnect', function () {
console.log('Server has disconnected');
});
});
require(routes/index.js)(socket);写哪里?
要在Express应用中将io
对象传递给routes/index.js
文件,你可以通过将io
对象作为参数传递给路由处理函数或将其挂载到全局对象上。以下是两种方法的示例:
方法一:通过参数传递
-
修改
app.js
:在创建服务器并启动后,将
io
对象保存到一个全局变量或直接传递给路由模块。var express = require('express'); var app = express(); var http = require('http').createServer(app); var io = require('socket.io')(http); app.set('port', process.env.PORT || 3000); io.on('connection', function(socket) { socket.emit('news', { hello: 'world' }); socket.on('message', function(data) { console.log(data); }); socket.on('disconnect', function() { console.log('Server has disconnected'); }); }); http.listen(app.get('port'), function() { console.log('Express server listening on port ' + app.get('port')); }); // 导出路由时传递io var routes = require('./routes/index')(io);
-
修改
routes/index.js
:修改路由文件以接受
io
参数。module.exports = function(io) { var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); // 可以在这里使用io对象 // io.emit('some-event', { message: 'Hello from route' }); }); return router; };
方法二:通过中间件挂载全局变量
-
修改
app.js
:创建一个中间件,在请求处理之前将
io
对象挂载到全局变量上。var express = require('express'); var app = express(); var http = require('http').createServer(app); var io = require('socket.io')(http); app.set('port', process.env.PORT || 3000); io.on('connection', function(socket) { socket.emit('news', { hello: 'world' }); socket.on('message', function(data) { console.log(data); }); socket.on('disconnect', function() { console.log('Server has disconnected'); }); }); http.listen(app.get('port'), function() { console.log('Express server listening on port ' + app.get('port')); }); // 使用中间件挂载io到全局 app.use(function(req, res, next) { req.io = io; next(); }); var routes = require('./routes/index'); app.use('/', routes);
-
修改
routes/index.js
:现在可以在路由处理函数中访问
req.io
。var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); // 使用req.io // req.io.emit('some-event', { message: 'Hello from route' }); }); module.exports = router;
这两种方法都可以有效地将io
对象传递到路由模块中。选择哪种方法取决于你的具体需求和偏好。