Почему я не могу отправить объект ответа Express через SocketIO? - PullRequest
0 голосов
/ 30 апреля 2018

Я пытаюсь отправить ответ на экспресс-запрос, отправив его клиенту ws и ожидая его ответа. Поэтому мне нужно отправить объект res клиенту (я не смог найти другой путь).

Вот что я сделал:

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', (req, res) => {
    res.sendFile(__dirname + '/index.html');
});

io.on('connection', (socket) => {
    socket.on('res', (e) => {
        e.res.send(e.data)
    })
})

app.get('/endpoint', (req, res) => {
    io.emit('req', { data: 'test', res: res });
});

http.listen(3000);

Однако после перехода в / конечную точку я получаю эту ошибку:

RangeError: превышен максимальный размер стека вызовов
в Function.isBuffer (buffer.js: 428: 36)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:42:87)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
на сайте hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
на сайте hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)
в hasBinary (/workspace/socketio/node_modules/has-binary2/index.js:56:59)

1 Ответ

0 голосов
/ 30 апреля 2018

Почему я не могу отправить объект ответа Express через SocketIO?

Когда объекты отправляются через socket.io, они конвертируются в JSON с использованием JSON.stringify() (или чего-то подобного). Но JSON.stringify() имеет некоторые требования, прежде чем он будет работать должным образом. В частности, он поддерживает только определенные типы данных и не поддерживает циклические ссылки, и я предполагаю, что у вас есть проблемы с обоими из них в объекте res.

Непонятно, чего именно вы здесь пытаетесь достичь. Буквально нет никакой причины отправлять объект res вашему клиенту. Даже если бы он мог быть строковым, клиент все равно ничего не мог бы сделать с этой информацией. Это просто служебная информация с вашего сервера для отправки ответа с сервера, и эта информация может использоваться только самим сервером, а не клиентом.

Если вы хотите отправить сообщение клиенту и дождаться его ответа, то у socket.io есть возможность сделать это. Он работает, передавая обратный вызов в качестве 3-го аргумента .emit(), и затем клиент делает что-то похожее для создания своего ответа. Документацию по этой функции "ack" для socket.io можно посмотреть здесь .

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