Это мой файл сокета
let io;
module.exports = {
init: httpServer => {
io = require('socket.io')(httpServer);
return io;
},
getIO: () => {
if(!io) {
throw new Error('io does\'nt exist');
}
return io;
}
};
Это мое основное приложение. js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const multer = require('multer');
const cors = require('cors');
const uuid = require('uuid/v1');
const path = require('path');
const session = require('express-session');
const MongoDBSession = require('connect-mongodb-session')(session);
const authRoutes = require('./routes/auth');
const postRoutes = require('./routes/post');
const store = new MongoDBSession({
uri: 'mongodb+srv://@cluster0-tpp9z.mongodb.net/social-media?retryWrites=true&w=majority',
collections: 'session'
});
app.use(session({
secret: 'secret_key', resave: false, saveUninitialized: false, store: store
}));
const fileStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, 'images');
},
filename: (req, file, cb) => {
cb(null, uuid() + '.' + file.originalname);
}
});
const fileFilter = (req, file, cb) => {
if(file.mimetype === 'image/png' || file.mimetype === 'image/jpg' || file.mimetype === 'image/jpeg') {
cb(null, true);
} else {
cb(null, false);
}
};
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(multer({storage: fileStorage, fileFilter: fileFilter}).single('image'));
app.use('/images', express.static(path.join(__dirname, 'images')));
app.use(cors());
app.options('*', cors());
app.use((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
res.setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers,X-Access-Token,XKey,Authorization');
next();
});
app.use('/auth', authRoutes);
app.use('/posts', postRoutes);
mongoose.connect('mongodb+srv://:@cluster0-tpp9z.mongodb.net/social-media?retryWrites=true&w=majority')
.then(res => {
const server = app.listen(process.env.PORT || 5000);
const io = require('./socket').init(server);
io.on('connection', socket => {
console.log('connected');
});
})
.catch(err => {
console.log('not connected');
});
Но я не могу получить доступ к объекту io в контроллере, здесь.
exports.x = (req, res, next) => {
const body = req.body.msg;
console.log('msg', body);
io.getIO().on('join', data => {
console.log(data);
});
};
Когда я получаю запрос сокета внутри приложения. js это работает, но не работает в контроллере x. Я думаю, что это должно работать, так как app.listen запускается до того, как я получаю доступ к io в контроллерах. Ссылки на соответствующую статью были бы полезны.