Поймать обратный вызов выполняется вместо обратного вызова при выполнении запроса http от одного сервера к другому - PullRequest
0 голосов
/ 06 июня 2019

Я использую node-fetch для вызова из одного API в другой, однако при возникновении ошибки в «API 2» выполняется обратный вызов успеха.

Я не уверен, является ли это предполагаемым поведением или нет, и если вы должны проверить ответ для кода состояния, а не для выполнения обратного вызова catch.

API 1:

fetch('http://localhost:4060/api/passwords', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    userId: doc._id,
    hash: hash
  })
})
.then((response) => {
  console.log(response);
  return res.json(doc);
})
.catch((e) => {
  console.log('ERROR')
  next(e);
});

API 2:

app.use((err, req, res, next) => {

  res.status(err.status).json({
    message: err.isPublic ? err.message : httpStatus[err.status],
    stack: config.env === 'development' ? err.stack : {}
  });
});

При возникновении ошибки в «API 2» ответ выглядит следующим образом:

Response {
  size: 0,
  timeout: 0,
  [Symbol(Body internals)]: 
   { body: 
      PassThrough {
        _readableState: [Object],
        readable: true,
        domain: null,
        _events: [Object],
        _eventsCount: 3,
        _maxListeners: undefined,
        _writableState: [Object],
        writable: false,
        allowHalfOpen: true,
        _transformState: [Object] },
     disturbed: false,
     error: null },
  [Symbol(Response internals)]: 
   { url: 'http://localhost:4060/api/passwords',
     status: 400,
     statusText: 'Bad Request',
     headers: Headers { [Symbol(map)]: [Object] },
     counter: 0 } }

Как видите, произошла ошибка, и фрагмент из API 2 запустился, возвращая ошибку с кодом состояния 400.

Как упоминалось выше, это предполагаемое поведение? У меня сложилось впечатление, что catch должен работать вместо then, есть ли способ, которым я могу настроить свой код для этого?

1 Ответ

2 голосов
/ 06 июня 2019

catch предназначен для случаев, когда в вашем коде есть ошибки или что-то помешало вашему коду выполнить / выполнить.В случае fetch этими условиями могут быть заблокированный порт, сбой в сети, переустановка соединения с сервером или что-либо, что не позволило выполнить ваш запрос.Сервер, возвращающий 400, не является ошибкой кода.Запрос был выполнен.Ответ был дан.Вы просто не получили данные, которые ожидали.Это логическая ошибка.

Так что вам придется проверять 400/500 ошибок в вашем коде вручную.

Чтобы провести аналогию, представьте, что вы пытаетесь прочитать файл по fs.readFile('test.json',(err,data) => console.log(data)).Если данные пусты, это не ошибка.Код прочитал файл и просто нечего было сообщить.Если данные искажены, это не ошибка.Возможно, это проблема кодировки, и вы неправильно анализируете контент.Ошибка может заключаться в том, что файл заблокирован другим процессом, разрешения запрещены, файл не существует и т. Д.

...