#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?