Совершая вызов axios внутри моего контроллера express, как мне вернуть статус?

#javascript #node.js #typescript #express #error-handling

Вопрос:

Я не уверен, что настраиваю свой экспресс-контроллер для правильного возврата правильного ответа. Когда конечная точка будет поражена, я хочу позвонить в адресную службу с помощью axios и вернуть данные или вернуть ответ в случае ошибки. Однако в настоящее время он возвращает ошибку по умолчанию 400, если ее невозможно найти, но статус ответа по-прежнему будет 200.

Существует ли здесь методология по умолчанию, которую я упускаю, или это отчасти правильно?

контроллер

 const getAddressWithPostcode = async (params: Params) => {
  const { postCode, number } = params

  const addressUrl = `${URL}/${postCode}${number
    ? `/${number}?api-key=${API_KEY}`
    : `?api-key=${API_KEY}`}`

  try {
    const { data } = await axios.get(addressUrl)
    return data
  } catch (e) {
    // throw e
    const { response: { status, statusText } } = e
    return {
      service: 'Address service error',
      status,
      statusText,
    }
  }
}

const findAddress = async (req: Request<Params>, res: Response, next: NextFunction) => {
  const { params } = req

  await getAddressWithPostcode(params)
    .then((data) => {
      res.send(data).status(200)
    })
    .catch((e) => {
      console.log('e', e)
      next(e)
    })
}
 

Если я отправляю сомнительный запрос (с помощью почтальона), я получаю статус ответа 200, но возвращаемые данные-это объект со статусом и текстом. Я хочу сделать это своим ответом по умолчанию, а не возвращать объект с этими свойствами. (см. изображение ниже).

введите описание изображения здесь

Просто какое-то направление здесь было бы хорошим, потенциально лучше всего использовать асинхронное ожидание в express и возврат ошибок при использовании внешнего вызова axios внутри.


Обновить:

обновил свой код до этого, в ответ на ответ я немного переработал свой код.

 const getAddressWithPostcode = async (params: Params) => {
  const { postCode, number } = params

  const addressUrl = `${URL}/${postCode}${number
    ? `/${number}?api-keey=${API_KEY}`
    : `?api-key=${API_KEY}`}`

  try {
    const { data } = await axios.get(addressUrl)
    return data
  } catch (e) {
    // throw e
    const { response } = e
    return response
  }

}

const findAddress = async (req: Request<Params>, res: Response, next: NextFunction) => {
  const { params } = req

  await getAddressWithPostcode(params)
    .then((data) => {
      console.log('data', data)
      if (data.status !== 200) res.sendStatus(data.status)
      else {
        res.send(data)
      }
    })
    .catch(err => {
      console.log('err', err)
      next(err)
    })
}
 

Ответ №1:

Если вы хотите отправить тот же код http-ответа, который вы получаете от вызова axios, просто измените код ниже на одну строку в своем контроллере.

 // Every time send same http status code 200
res.send(data).status(200)

// Send same http status code as returned by axios request
res.send(data).status(data.status)
 

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

1. Спасибо, это сработало — я так понимаю, это обычная практика? Затем улов должен возвращать любую сетевую ошибку, а не ошибку axios?