[英]how to use socket.io in controller file
我正在使用 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;
}
但是既没有给我一个错误也没有工作。
任何人都可以帮忙,如何将其导出到单独的文件中,以便可以分离客户端和服务器代码?
提前感谢您的帮助。
这就是我如何让它工作的。
步骤如下:
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)在这 2 个步骤之后,在您的控制器文件或您需要发出事件的任何其他文件中,您可以执行以下操作:
const { Socket } = require("../../utils/socket");
Socket.emit("newMessage", {
message: "hello from controller"
});
要从控制器发出消息,控制器需要访问原始 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);
您可以在服务文件中执行完全相同的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.