首页 > 解决方案 > 控制器上的 Socket.IO

问题描述

我对套接字很陌生,我一直在努力实现我在网上看到的一些文档。这是我目前的设置,我想仅针对 healthcheck api 端点 (/api/v1/healthcheck) 运行 socket.io 我将如何在 healthcheck 控制器中运行 socket io?并对响应进行更改?任何帮助表示赞赏,我正在撕扯我的头发:(

服务器.js

const socket = require('socket.io')

const healthcheck = require('./routes/healthcheck');
const auth = require('./routes/auth');
const users = require('./routes/users');

const server = app.listen(
  PORT,
  console.log(
    `Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.cyan.bold
  )
);

let io = require('socket.io')(server);
app.set("io", io);

//Auth
app.use('/api/v1/auth', auth);
app.use('/api/v1/users', users);  
//Health check
app.use('/api/v1/healthcheck', healthcheck);

/routes/healthcheck.js

const express = require('express');
const { checkHealth } = require('../controllers/healthcheck');

const router = express.Router();

router.post('/', checkHealth);

module.exports = router;

/controllers/healthcheck.js

const asyncHandler = require('../middleware/async');

exports.checkHealth = asyncHandler(async (req, res, next) => {
    res.status(200).json({
        success: true,
        data: {
            status: "Alive!"
        }
    });
});

标签: node.jsrestapiexpresssocket.io

解决方案


您可以将实例传递io到该运行状况检查路由中,然后简单地监听事件并采取行动。下面的示例代码。

服务器.js

const socket = require('socket.io')

const server = app.listen(
  PORT,
  console.log(
    `Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.cyan.bold
  )
);

let io = require('socket.io')(server);
app.set("io", io);

// pass in io to the relevant route
const healthcheck = require('./routes/healthcheck')(io);
const auth = require('./routes/auth');
const users = require('./routes/users');

//Auth
app.use('/api/v1/auth', auth);
app.use('/api/v1/users', users);  
//Health check
app.use('/api/v1/healthcheck', healthcheck);

健康检查路线

const express = require('express');
const { checkHealth } = require('../controllers/healthcheck');

const router = express.Router();

module.exports = (io) => {
   router.post('/', checkHealth);

   io.on('connection', socket => {
      socket.emit('hello', {message: 'helloworld'});

      socket.on('reply', checkHealth.someMethod); 
   });

   return router;
}

我宁愿在文件中创建端点——就像你为快速路由所做的一样,并在你的 server.js 中初始化它们,如下所示:

let io = require('socket.io')(server);
app.set("io", io);

io.on('connection', socket => {
   require('./myendpointexample')(socket);
});

myendpointexample.js

module.exports = (socket) => {
   socket.on('myevent', (message) => {
      mycontroller.myFunction(message).then(result => {
          socket.emit('myEvent', result);
      });
   });
};

推荐阅读