2017-02-14 86 views
0

好吧所以我有一些要求,我希望能够在我的服务器中的任何地方使用Socket.IO,特别是在任何CRUD操作执行完成后发送事件的路由中。将Socket.io模块导出为全局可用。

以下是一个名为sockets.js的文件,我用它来初始化套接字。

(function IIFE() { 
    2 'use strict'; 
    3 
    4 var socketIO = require('socket.io'); 
    5 
    6 exports.initialize = function (server) { 
    7  var io = socketIO.listen(server) 
    8 
    9  io.sockets.on('connection', (socket) => { 
10  console.log(socket) 
11  console.log("Connected"); 
12 
13  io.sockets.on('disconnect', (socket) => { 
14   console.log('Disconnect') 
15  }); 
16  }); 
17 } 
18 
19 })(); 

以下是我的app.js,它本质上是我的服务器。

2 (function IIFE() { 
    3 'use strict'; 
    4 
    5 const chalk = require('chalk'); 
    6 
    7 if(!process.env.NODE_ENV) { 
    8  console.log(chalk.red('No environment specified...') + chalk.blue('defaulting to \'development\'')); 
    9  process.env.NODE_ENV = 'development'; 
    10 } 
    11 
    12 const express = require('express'); 
    13 const mongoose = require('mongoose'); 
    14 
    15 const config = require('./config/environment'); 
    16 
    17 mongoose.connect(config.mongo.uri, config.mongo.options); 
    18 
    19 mongoose.connection.on('error', function(err) { 
    20  console.error('Mongo Error: ' + err); 
    21 }); 
    22 
    23 const app = express(); 
    24 const server = require('http').createServer(app); 
    25 
+ 26 var io = require('./sockets.js'); 
+ 27 io.initialize(server); 
+ 28 
    29 require('./config/express')(app); 
    30 require('./routes')(app); 
    31 
    32 server.listen(config.port, config.ip, function() { 
    33  console.log('order-api listening on %d in %s mode', config.port, app.get('env')); 
    34 }); 
    35 
    36 exports = module.exports = app; 
    37 })(); 

以下文件位于另一个名为api的文件夹中。整个应用程序是一个功能正常的应用程序,我试图将套接字整合到一起。然而,我似乎无法理解如何从我的sockets.js集成套接字,并在以下路由处理程序中使用它们。

(function IIFE() { 
    2 'use strict'; 
    3 
    4 const router = require('express').Router(); 
    5 
    6 router.use('/carts', require('./cart')); 
    7 router.use('/orders', require('./order')); 
    8 router.use('/reports', require('./report')); 
    9 router.use('/validators', require('./validator')); 
10 
11 module.exports = router; 
12 })(); 
+0

有理由零包装的IIFE内的模块。它们已经由node.js自动包装在函数范围内。无需创建另一个。 – jfriend00

回答

1

你可以声明变量ioglobal对象的内部,使得它是可见来自世界各地。

global.io = socketIO.listen(server)