Сделайте так, чтобы socket.io работал в конечной точке API в Node.js - PullRequest
1 голос
/ 20 мая 2019

У меня следующая логика (все серверы в Node.js):

1 - клиент выполняет API-вызов для конечной точки «api / request» сервера A.

2- Сервер Конечная точка «запрос» получает запрос и просто передает исходный запрос на сервер B с событием emit socket.io.

3- Сервер B socket.io on получает запрос, обрабатывает его и отправляет ответ в новом событии socket.io emit.

4- Сервер Событие socket.io on получает ответ и должен вернуть ответ клиенту, который первоначально сделал запрос.

Проблема заключается в том, что, поскольку на сервере A я передаю запрос с событием emit socket.io, я теряю опцию ожидания ответа от сервера B для возврата клиенту чего-либо. Я бы хотел, чтобы клиент получил ответ от сервера B в ответ на исходный вызов на сервер A.

Есть идеи, как этого добиться?

1 Ответ

0 голосов
/ 26 мая 2019

Я нашел способ.Поскольку в вашем коде может быть только один 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.

Решено!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...