【问题标题】:how to use socket.io in controller file如何在控制器文件中使用 socket.io
【发布时间】:2018-03-08 23:48:46
【问题描述】:

我正在使用 Node.JS Express 和 socket.io。 所以我的想法是直接从控制器的插入方法发出消息。在我的 server.js 文件中,我正在创建 socket.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});   
    });

  });

我正在创建这样的控制器文件 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);
        });
}

我还创建了一个服务文件 名字是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;
}

但是既不给我错误也不工作。

谁能帮忙,我怎样才能将它导出到一个单独的文件中,以便可以分离客户端和服务器代码?

提前感谢您的帮助。

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

    这就是我让它工作的方式。

    步骤如下:

    1) 我创建了一个 utils 文件夹,在其中我创建了一个名为 socket.js 的文件

    utils/socket.js
    
    const Server = require('socket.io');
    const io = new Server();
    
    var Socket = {
        emit: function (event, data) {
            console.log(event, data);
            io.sockets.emit(event, data);
        }
    };
    
    io.on("connection", function (socket) {
        console.log("A user connected");
    });
    
    exports.Socket = Socket;
    exports.io = io;
    
    

    2)然后在我的服务器(app.js)中我做了这个

    app.js
    
    const app = express();
    
    const server = http.createServer(app);
    const { io } = require("./utils/socket");
    io.attach(server);
    
    
    module.exports = app;
    

    3)在这两个步骤之后,在您的控制器文件或任何其他需要发出事件的文件中,您可以这样做:

    const { Socket } = require("../../utils/socket");
    
    Socket.emit("newMessage", {
          message: "hello from controller"
     });
    
    

    【讨论】:

      【解决方案2】:

      要从控制器发出消息,控制器需要能够访问原始 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);
      

      您可以在服务文件中执行完全相同的操作。

      【讨论】:

      • 我需要像上面这样的单独函数,例如 function getAllMessage() { //*****// }
      猜你喜欢
      • 2022-01-03
      • 2013-11-02
      • 2022-12-03
      • 2022-12-11
      • 1970-01-01
      • 2021-01-08
      • 2021-03-04
      • 1970-01-01
      • 2017-06-03
      相关资源
      最近更新 更多