1) Обратный вызов не был отправлен со стороны клиента / обратный вызов не является функцией, и существует необходимость отвечать со стороны сервера что-то вроде «Ошибка: обратный вызов не предоставляется. Использование: ... '
Клиент и сервер должны договориться, как это сделать. Если клиент не предоставляет обратный вызов, то аргумент сервера будет undefined
, поэтому вы можете определить это с сервера.
Итак, правильный способ сделать это:
// client
socket.emit('someMsg', someData, function(response) {
console.log(`Got ${response} from server`);
});
// server
io.on('connection', socket => {
socket.on('someMsg', (data, fn) => {
console.log(`Got data ${data} from client, sending response`);
// if client wants a response, send the response
if (fn) {
fn("got your data");
}
});
});
Итак, если клиент не пройдет обратный вызов, то fn
на стороне сервера будет undefined
. Таким образом, вы можете проверить это перед вызовом.
2) Что касается случая, когда нам нужно отправить некоторую ошибку обратно, я нашел только обходной путь для возврата указанного c , заранее согласовано, ложное значение, такое как null, что означает, что никакие данные не могут быть возвращены.
Да, вы должны заранее договориться о том, как отправить ошибку обратно. Самый простой способ вернуть ошибку, вероятно, заключаться в том, чтобы обернуть ваш ответ в объект и использовать свойство .error
для этого объекта.
// client
socket.emit('someMsg', someData, function(response) {
if (response.error) {
console.log(`Got error ${response.error} from server`);
} else {
console.log(`Got data ${response.data} from server`);
}
});
// server
io.on('connection', socket => {
socket.on('someMsg', (data, fn) => {
console.log(`Got data ${data} from client, sending response`);
// if client wants a response, send the response
if (fn) {
// no error here
fn({error: null, data: "Got your message"});
}
});
});
Здесь вы видите, что socket.io на самом деле это не протокол типа запрос / ответ, а socket.io пытался создать небольшой ответ, вокруг которого вы должны построить свою собственную структуру.
Или, если есть ошибка, вы можете отправить объект ошибки. :
// server
io.on('connection', socket => {
socket.on('someMsg', (data, fn) => {
console.log(`Got data ${data} from client, sending response`);
// if client wants a response, send the response
if (fn) {
// send an error here
fn({error: new Error("xxx Error")});
}
});
});
На стороне сервера нет простой функции промежуточного программного обеспечения, которая проверяет входные данные и возвращает ошибку перед выполнением основного логика c.
I не понимаете, для чего вы пытаетесь использовать промежуточное ПО или для проверки? единственное место, где эти данные присутствуют, находится в вашем обработчике сообщений, поэтому любая проверка на стороне сервера, которую вы хотите сделать для того, что отправил клиент, должна быть там. Вы, безусловно, можете выполнить эту проверку до того, как отправите ответ.
Попробую отфильтровать события по их именам на уровне сокетов, чтобы добавить необходимые функции и отправить ошибку следующим образом ( новая ошибка (...)) ;? В этом случае может быть работа с прослушиванием события ошибки, я думаю.
Socket.io не работает как Express, и я не понимаю, почему вы пытаетесь сделать это работает таким образом. next()
не участвует в получении сообщения socket.io, поэтому я не уверен, что вы пытаетесь сделать там. Существует опция для промежуточного программного обеспечения при первом подключении к socket.io, но не для последующих сообщений, отправляемых по этому соединению.
Существует ли способ отправки ответа с сервера, даже если обратный вызов не предусмотрен со стороны клиента?
Если клиент не предоставляет обратный вызов, то единственный способ отправить ответ обратно клиенту - это отправить другое сообщение. Но весь смысл отправки ответа заключается в том, что у вас есть взаимодействующий клиент, который прослушивает и ожидает ответ, поэтому клиент также может использовать обратный вызов, если он хочет получить ответ. Если клиент не хочет получить ответ и не будет ничего кодировать для его получения, вы ничего не можете с этим поделать.