Я нашел способ.Поскольку в вашем коде может быть только один io.on('connection', function (socket) {})
, мне пришлось искать способ его обойти.
Проблема заключалась в том, что если вы поместите io.on('connection', function (socket) {})
в свой router.post('/', async (req, res) => {})
, он будет срабатывать только тогда, когдаВы называете свою конечную точку.В моем случае у меня было несколько событий сокетов, которые я хотел вызвать в любое время, а не только при вызове конечной точки.Поэтому я должен был поместить io.on('connection', function (socket) {})
вне моего router.post('/', async (req, res) => {})
.Таким образом, я не мог использовать var io = req.app.get('socketio');
внутри маршрутизатора.Вот что я сделал вместо этого в коде сервера A:
index.js:
const cors = require('cors');
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
const taskRequest = require('./routes/taskRequest')(io);
app.use(cors())
app.use(express.json());
app.use('/api/taskRequest', taskRequest);
server.listen(4002);
routs / taskRequest.js
const express = require('express');
const router = express.Router();
module.exports = function(io) {
//we define the variables
var sendResponse = function () {};
io.sockets.on("connection",function(socket){
// Everytime a client logs in, display a connected message
console.log("Server-Client Connected!");
socket.on('connected', function(data) {
//listen to event at anytime (not only when endpoint is called)
//execute some code here
});
socket.on('taskResponse', data => {
//calling a function which is inside the router so we can send a res back
sendResponse(data);
})
});
router.post('/', async (req, res) => {
//pickedUser is one of the connected client
var pickedUser = "JZLpeA4pBECwbc5IAAAA";
io.to(pickedUser).emit('taskRequest', req.body);
sendResponse = function (data) {
return res.status(200).json({"text": "Success", "response": data.data});
}
});
return router;
};
Как это, сервер Aотправляет ответ клиенту только после получения ответа от сервера B.
Решено!