Node.js ';共享';NodeJS模块之间的对象
我是NodeJS开发的新手,正在使用socket.io库进行一些测试。基本上,我想做的是在客户端(Angular 6 web app)和服务器之间建立socket.io连接,并在新用户连接时广播消息 现在,代码非常简单,这就是我所拥有的: app.jsNode.js ';共享';NodeJS模块之间的对象,node.js,socket.io,Node.js,Socket.io,我是NodeJS开发的新手,正在使用socket.io库进行一些测试。基本上,我想做的是在客户端(Angular 6 web app)和服务器之间建立socket.io连接,并在新用户连接时广播消息 现在,代码非常简单,这就是我所拥有的: app.js var express = require('express'); var http = require('http'); var socketIO = require('socket.io'); // Routes var twitterRo
var express = require('express');
var http = require('http');
var socketIO = require('socket.io');
// Routes
var twitterRoutes = require('./routes/user');
var app = express();
var server = http.Server(app);
var io = socketIO(server); // <== THIS OBJECT IS WHAT I WANT TO USE FROM THE ROUTES
[ ... ]
io.on('connect', (socket) => {
console.log('New user connected');
socket.on('disconnect', (reason) => {
console.log('User disconnected:', reason);
});
socket.on('error', (err) => {
console.log('Error in connection: ', err);
});
});
var express = require('express');
var config = require('../config/config');
var router = express.Router();
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
// I WANT TO BROADCAST THE NEW LOGGED USER USING io.broadcast.emit, BUT DON'T KNOW HOW
// <=====
});
var io = socketIO(server);
global.ioObj = io;
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
if (global.ioObj) {
global.ioObj.sockets.clients().emit('new-message', { type: 'message', text: 'New user has logged in' });
}
});
我怎么做呢?提前感谢,不确定这是否是最好的方式,但您可以使用中间件在请求处理程序之间共享内容
// define and use a middleware
app.use(function shareIO(req, res, next) {
req.io = io;
next();
})
然后您可以在请求处理程序中使用req.io
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
req.io.emit('event')
});
您可以通过在函数中注入IO变量来做您想做的事情
// app.js
var app = express();
var server = http.Server(app);
var io = socketIO(server);
server.use(require('./router')(io))
...
// router.js
module.exports = function makeRouter(io) {
var router = express.Router();
router.post('/login', (req, res, next) => {
// do something with io
}
return router
}
我不知道这是否是最佳实践,但我已将
io
对象指定给global
对象的一个属性,我可以从应用程序的任何地方访问它。这就是我所做的:
app.js
var express = require('express');
var http = require('http');
var socketIO = require('socket.io');
// Routes
var twitterRoutes = require('./routes/user');
var app = express();
var server = http.Server(app);
var io = socketIO(server); // <== THIS OBJECT IS WHAT I WANT TO USE FROM THE ROUTES
[ ... ]
io.on('connect', (socket) => {
console.log('New user connected');
socket.on('disconnect', (reason) => {
console.log('User disconnected:', reason);
});
socket.on('error', (err) => {
console.log('Error in connection: ', err);
});
});
var express = require('express');
var config = require('../config/config');
var router = express.Router();
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
// I WANT TO BROADCAST THE NEW LOGGED USER USING io.broadcast.emit, BUT DON'T KNOW HOW
// <=====
});
var io = socketIO(server);
global.ioObj = io;
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
if (global.ioObj) {
global.ioObj.sockets.clients().emit('new-message', { type: 'message', text: 'New user has logged in' });
}
});
路由/user.js
var express = require('express');
var http = require('http');
var socketIO = require('socket.io');
// Routes
var twitterRoutes = require('./routes/user');
var app = express();
var server = http.Server(app);
var io = socketIO(server); // <== THIS OBJECT IS WHAT I WANT TO USE FROM THE ROUTES
[ ... ]
io.on('connect', (socket) => {
console.log('New user connected');
socket.on('disconnect', (reason) => {
console.log('User disconnected:', reason);
});
socket.on('error', (err) => {
console.log('Error in connection: ', err);
});
});
var express = require('express');
var config = require('../config/config');
var router = express.Router();
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
// I WANT TO BROADCAST THE NEW LOGGED USER USING io.broadcast.emit, BUT DON'T KNOW HOW
// <=====
});
var io = socketIO(server);
global.ioObj = io;
router.post('/login', (req, res, next) => {
// DO ROUTE LOGIC
if (global.ioObj) {
global.ioObj.sockets.clients().emit('new-message', { type: 'message', text: 'New user has logged in' });
}
});