Где мне обработать feathersjs / socketio-ошибку подключения к клиенту

#socket.io #feathersjs

#socket.io #feathersjs

Вопрос:

Я использую feathers с socketio в серверной части. Клиент прослушивает, и все работает хорошо.

Я хочу обработать ошибку «сервер не отвечает», но я не нахожу, где я могу это сделать?

Ошибка, выданная сервером:

 "Unhandled promise rejection 
Object { type: "FeathersError", name: "Timeout", message: "Timeout of 5000ms exceeded calling find on newsfeed", code: 408, className: "timeout", data: {…}, errors: {}, stack: "FeathersError@webpack-internal:///./node_modules/@feathersjs/errors/lib/index.js:58:19nTimeout@webpack-internal:///./node_modules/@feathersjs/errors/lib/index.js:135:3nsend/</timeoutId<@webpack-internal:///./node_modules/@feathersjs/transport-commons/lib/client.js:66:9n" }"
  

Это правильно, «обещание» не обрабатывается! Где мне обрабатывать?

Я попытался добавить catch в каждую строку, просто чтобы посмотреть, что работает, но безуспешно:

 import feathers from '@feathersjs/feathers'
import socketio from '@feathersjs/socketio-client'
import io from 'socket.io-client'

const socket = io('http://localhost:3030/', {transports: ['websocket']});
socket.on("connect_failed", er=>console.error('Error connecting to server: ', er));
const restApi = feathers()
  .configure(socketio(socket));

try {
  restApi.service('/newsfeed');
  restApi.on("connect_failed", er=>console.error('Error connecting to server: ', er));

}
catch (er) {
    console.error('Error connecting to server: ', er)
}

export default restApi
  

Ответ №1:

Ошибка тайм-аута исходит от конкретного запроса, поэтому вам нужно обрабатывать ее везде, где вы делаете запрос.

restApi.service('/newsfeed').find()

Если вы используете async / await, вы можете обернуть свой вызов службы в try / catch, или мой личный фаворит — просто поместить catch в вызов;

 // try/catch
try {
  const response= await restApi.service('/newsfeed').find();
catch(e) {
  // handle e
}

//just use catch
const response= await restApi.service('/newsfeed').find().catch(e => {
  // handle e
});
  

Если вы используете promises, просто используйте catch:

 restApi.service('/newsfeed').find().then(response => {
  // handle response
}).catch(e => {
  // handle e
});
  

Комментарии:

1. Вы правы, но в данном случае речь идет о подключении к. Там, где я использую find (или get , post и т.д.), Конечно, я catch как сервер отправляю обратно несколько типов ошибок, таких как запрещено / пользователь не аутентифицирован и т.д., С пользовательским кодом ошибки.

2. У меня есть компонент, который подписывается на события disconnect , connect_timeout connect и reconnect от клиента сокета ( restApi.io в вашем случае). Он обрабатывает отображение / скрытие сообщения, когда API переходит в автономный режим. Все события перечислены здесь: socket.io/docs/client-api /…

3. Круто! У меня тоже такое! (используя Vue — он скрывает экран и отображает только статус: подключение к Интернету и доступность сервера API. Когда я получаю 404 или другие специфические ошибки при обычных вызовах, я включаю его. Но здесь я не знаю, как это сделать, как поймать «404» (или аналогичный) из socket.io . То, что я пробовал для обнаружения ‘connect_error’, не удалось.

4. Вы можете прослушивать только события, перечисленные в сокете. документы по вводу-выводу. Все это события уровня подключения. Чтобы «прослушать» 404s и другие ошибки, вы можете либо перехватить их и сообщить об ошибке другим вашим компонентам, либо использовать перехватчики ошибок. Документы. feathersjs.com/api/hooks.html#application-hooks