Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js ';共享';NodeJS模块之间的对象_Node.js_Socket.io - Fatal编程技术网

Node.js ';共享';NodeJS模块之间的对象

Node.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

我是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 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' });
  }

});