如何在控制器文件中使用socket.io

我正在使用Node.JS Express和socket.io。 所以我的想法是直接从我的控制器的插入方法发出消息。 在我的server.js文件中,iam创buildsocket.io对象,并尝试使其可用于其他模块:

我的server.js是这样的

require('rootpath')(); var express = require('express'); var app = express(); var cors = require('cors'); var bodyParser = require('body-parser'); var expressJwt = require('express-jwt'); var config = require('config.json'); var mongoose = require('mongoose'); mongoose.connect(config.connectionString); var db = mongoose.connection; db.on('error',console.error.bind(console,'Connection error')); db.on('open',function(){ console.log('connected'); }); app.use(cors()); app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json()); // use JWT auth to secure the api, the token can be passed in the authorization header or querystring app.use(expressJwt({ secret: config.secret, getToken: function (req) { if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { return req.headers.authorization.split(' ')[1]; } else if (req.query && req.query.token) { return req.query.token; } return null; } }).unless({ path: [ '/users/authenticate', '/users/register', '/users', '/chats','/chats/sendMessage', '/rooms','/rooms/create', '/chats/connection', '/chats/add-message' ] })); // routes app.use('/users', require('./controllers/users.controller')); app.use('/chats', require('./controllers/chats.controller')); app.use('/rooms', require('./controllers/rooms.controller')); var http = require('http').Server(app); var io = require('socket.io')(http); io.on('connection', (socket) => { console.log('The user is connected'); socket.on('new-message', (message,userInfo) => { console.log(userInfo); console.log(message); io.emit('message', {type:'new-message', text: message}); }); socket.on('disconnect', function(){ console.log('The user is disconnected'); }); socket.on('add-message', (message,userInfo) => { console.log(userInfo); console.log(message); io.emit('message', {type:'new-message', text: message}); }); socket.on('add-record', (record) => { io.emit('getrecord', {type:'new-record', text: record}); }); }); // start server var port = process.env.NODE_ENV === 'production' ? 80 : 4000; var server = http.listen(port, function () { console.log('Server listening on port ' + port); }); 

客户端 – 接收到数据时发送欢迎消息

我怎么能在chat.controller.js中使用下面的套接字连接

 io.on('connection', (socket) => { console.log('The user is connected'); socket.on('new-message', (message,userInfo) => { console.log(userInfo); console.log(message); io.emit('message', {type:'new-message', text: message}); }); socket.on('disconnect', function(){ console.log('The user is disconnected'); }); socket.on('add-message', (message,userInfo) => { console.log(userInfo); console.log(message); io.emit('message', {type:'new-message', text: message}); }); socket.on('add-record', (record) => { io.emit('getrecord', {type:'new-record', text: record}); }); }); 

我正在创build控制器文件像这样chats.controller.js

 var config = require('config.json'); var express = require('express'); var router = express.Router(); var userService = require('../services/user.service'); var chatService = require('../services/chat.service'); // routes router.post('/sendMessage', send); router.get('/', getAll); module.exports = router; function send(req, res) { chatService.sendMessage(req.body) .then(function () { res.sendStatus(200); }) .catch(function (err) { res.status(400).send(err); }); } function getAll(req, res) { chatService.getAllMessage() .then(function (chats) { res.send(chats); }) .catch(function (err) { res.status(400).send(err); }); } function getCurrent(req, res) { userService.getById(req.user.sub) .then(function (user) { if (user) { res.send(user); } else { res.sendStatus(404); } }) .catch(function (err) { res.status(400).send(err); }); } function update(req, res) { userService.update(req.params._id, req.body) .then(function () { res.sendStatus(200); }) .catch(function (err) { res.status(400).send(err); }); } function _delete(req, res) { userService.delete(req.params._id) .then(function () { res.sendStatus(200); }) .catch(function (err) { res.status(400).send(err); }); } 

而且我还创build了一个服务文件名是chat.service.js

 var config = require('config.json'); var _ = require('lodash'); var jwt = require('jsonwebtoken'); var bcrypt = require('bcryptjs'); var Q = require('q'); var mongoose = require('mongoose'); var Chat = require('../model/chat'); var service = {}; service.sendMessage = sendMessage; service.getAllMessage = getAllMessage; module.exports = service; function sendMessage(userParam) { var deferred = Q.defer(); var chat = new Chat({ room_id:userParam.from_id, from_id:userParam.from_id, to_id:userParam.to_id, chatrp_id:userParam.chatrp_id, message:userParam.message }); chat.save(function (err,doc) { if (err) deferred.reject(err.name + ': ' + err.message); deferred.resolve(); }) return deferred.promise; } function getAllMessage() { var deferred = Q.defer(); Chat.find({},function (err, response) { if (err) deferred.reject(err.name + ': ' + err.message); // return users (without hashed passwords) response = _.map(response, function (res) { return _.omit(res, 'hash'); }); deferred.resolve(response); }); return deferred.promise; } 

但是,既不是给我一个错误或不工作。

任何人都可以请帮忙,我怎样才能导出在一个单独的文件,使客户端和服务器代码可以分开?

预先感谢您的帮助。

要从控制器发出消息,控制器需要访问原始的socket.io实例。

所以,在chats.controller.js我会这样做:

 module.exports = function(io){ return { function: getAll(req, res){ // here you now have access to socket.io. // you can either do: io.emit('new-message',{ // new message object }); // or you can include your chat service the same way // that this file is included and call the appropriate function }, } }; 

要使用这个控制器,就这样做

 const someController = require('./path/to/chats.controller.js')(io); 

你可以在你的服务文件中完全一样。