node.js - Controller 上的 Socket.IO

标签 node.js rest api express socket.io

我对套接字还很陌生,并且一直在努力实现我在网上看到的一些文档。这是我当前的设置,我想仅针对 healthcheck api 端点 (/api/v1/healthcheck) 运行 socket.io,我将如何在 healthcheck Controller 中运行套接字 io?并发出响应的变化?感谢任何帮助,我正在撕扯我的头发:(

Server.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!"
        }
    });
});

最佳答案

您可以将 io 实例传递到该运行状况检查路由中,然后只需监听事件并采取操作即可。下面是示例代码。

server.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);
      });
   });
};

关于node.js - Controller 上的 Socket.IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58864595/

相关文章:

rest - 特定模型的自定义 REST url

ios - RestKit 0.20 映射问题(使用来自 API 的 JSON)

用于获取嵌套对象字段的 Rest api 设计

php - 不相关的SQL表的大小是否会影响彼此的性能

node.js - 从回调外部调用变量nodejs

javascript - 从 ClojureScript 使用 highcharts Node 导出服务器时出现问题 - "0x03 error when performing chart generation"

java - JAX-RS 和资源所有权限制

rest - 基于浏览器的 OAuth/OpenID,具有持久登录功能

javascript - Grunt 不适用于自动引用 css 和 js

node.js - create-react-app > 错误 css-loader@1.0.0 : The engine "node" is incompatible with this module. 预期版本 ">= 6.9.0 <7.0.0 || >= 8.9.0"