从路由发出websocket消息

red*_* 87 6 javascript websocket node.js socket.io

我正在尝试使用websockets设置我的服务器,这样当我通过我的路由更新某些内容时,我还可以在更新该路由上的内容时发出websocket消息.

这个想法是当有人点击路线时将一些东西保存到我的Mongo数据库/add-team-member,例如然后向通过websocket连接的每个人发出消息,并且是与该团队相对应的任何websocket房间的一部分.

我按照socket.io的文档按以下方式设置我的应用程序:

App.js

// there's a lot of code in here which sets what to use on my app but here's the important lines

const app = express();
const routes = require('./routes/index');

const sessionObj = {
    secret: process.env.SECRET,
    key: process.env.KEY,
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({ mongooseConnection: mongoose.connection }),
             secret : 'test',
             cookie:{_expires : Number(process.env.COOKIETIME)}, // time im ms    
}

app.use(session(sessionObj));
app.use(passport.initialize());
app.use(passport.session());

module.exports = {app,sessionObj};
Run Code Online (Sandbox Code Playgroud)

start.js

const mongoose = require('mongoose');
const passportSocketIo = require("passport.socketio");
const cookieParser = require('cookie-parser');

// import environmental variables from our variables.env file
require('dotenv').config({ path: 'variables.env' });

// Connect to our Database and handle an bad connections
mongoose.connect(process.env.DATABASE);

// import mongo db models
require('./models/user');
require('./models/team');

// Start our app!
const app = require('./app');
app.app.set('port', process.env.PORT || 7777);

const server = app.app.listen(app.app.get('port'), () => {
  console.log(`Express running ? PORT ${server.address().port}`);
});

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

io.set('authorization', passportSocketIo.authorize({
  cookieParser: cookieParser,
  key:         app.sessionObj.key,       // the name of the cookie where express/connect stores its session_id 
  secret:      app.sessionObj.secret,    // the session_secret to parse the cookie 
  store:       app.sessionObj.store,        // we NEED to use a sessionstore. no memorystore please 
  success:     onAuthorizeSuccess,  // *optional* callback on success - read more below 
  fail:        onAuthorizeFail,     // *optional* callback on fail/error - read more below 
}));


function onAuthorizeSuccess(data, accept){}

function onAuthorizeFail(data, message, error, accept){}

io.on('connection', function(client) {  
  client.on('join', function(data) {
      client.emit('messages',"server socket response!!");
  });

  client.on('getmessage', function(data) {
    client.emit('messages',data);
});  

});
Run Code Online (Sandbox Code Playgroud)

我的问题是我有很多mongo数据库保存操作正在我的./routes/index文件中进行,我希望能够从我的路由发出消息,而不是从连接socket.io的start.js结束.

有没有办法我可以从我的./routes/index文件中发出websocket消息,即使IO在start.js中进一步设置了?

例如这样的事情:

router.get('/add-team-member', (req, res) => {
  // some io.emit action here
});
Run Code Online (Sandbox Code Playgroud)

也许我需要移动我正在初始化socket.io的东西,但无法找到任何关于此的文档或者我可以从某种方式从路由访问socket.io?

感谢并感谢您的帮助,如果有什么不清楚,请告诉我!

Rah*_*hul 1

您的 io 实际上是套接字对象,您可以通过以下方式从该对象向任何特定用户发出事件 -

io.to(userSocketId).emit('eventName', data);
Run Code Online (Sandbox Code Playgroud)

或者您可以通过以下方式广播 -

io.emit('eventName', data);
Run Code Online (Sandbox Code Playgroud)

只需在使用之前创建 require socket.io :)