Хорошая привычка кодирования неотделима от обработки исключений.Эта статья в основном расскажет, как изящно выдавать ошибки в рамках koa framework и единообразно обрабатывать возврат.
предисловие
Хорошая привычка кодирования неотделима от обработки исключений.Эта статья в основном расскажет, как изящно выдавать ошибки в рамках koa framework и единообразно обрабатывать возврат.
текст
koa — отличный веб-фреймворк NodeJS.Когда мы разрабатываем веб-проекты, мы не можем избежать различной обработки ошибок, включая ошибки Http и ошибки пользовательской бизнес-логики.
В NodeJS мы можем выдавать такие ошибки:
if (someCondition) {
throw Error('some error')
}
менее элегантный способ
http-ошибка
koa framework предоставляетctx.throw(400)
Кстати, мы можем запросто выдать http ошибки, но что, если вы хотите вернуть какую-то полезную информацию заодно? Возможно, вы сделаете это:
ctx.status = 400
ctx.body = {
msg: "some params is invalid"
}
ошибка бизнес-логики
Затем, если вы разрабатываете сервер Restful API, вам обязательно потребуется определить несколько кодов ошибок и описаний бизнес-логики, например следующие:
код | инструкция |
---|---|
0 | ok |
-1 | Ошибка сервера |
4001 | Истек Истек |
На уровне контроллера вы можете справиться с этим следующим образом (в верхнем регистре в примере кода все определения констант, поэтому я не буду повторять их позже):
router.get('/', (ctx, next) => {
if (tokenExpire(token)) {
const errcode = ERROR_CODE.TOKEN_EXPIRED
ctx.body = {
errcode,
msg: ERROR_MSG[errcode]
}
return
}
// do something
})
Но что, если вы хотите выдать эту ошибку на уровне сервиса? В настоящее время у вас может быть 2 способа справиться с этим:
-
Во-первых, объяснить ошибку, определив возвращаемое значение, а затем оценить возвращаемое значение в контроллере и вернуть соответствующий код ошибки, например:
const somefunc = async (token) => { const res = await tokenExpire(token) if (res) { return false } // do something }
-
Второй — выдать Error, перехватить исключение в контроллере и сравнить err.message, чтобы вернуть соответствующий код ошибки, например:
const somefunc = async (token) => { const res = await tokenExpire(token) if (res) { throw Error(ERROR_MSG.TOKEN_EXPIRED) } // do something }
Так есть ли лучший способ?
более элегантный способ
Есть ли более элегантный способ выдать ошибку? Ответ положительный. Мы надеемся, что везде, где прямая строка кода может вызвать ошибку, правильная обработка возвращает соответствующий код ошибки и информацию.
использоватьпромежуточное ПО коаплюс наш обычайМетоды, унаследованные от конструктора Errorможно реализовать.
- Определите HttpError и CustomError
function CustomError (code, msg) {
Error.call(this, '')
this.code = code
this.msg = msg || ERROR_MSG[code] || 'unknown error'
this.getCodeMsg = function () {
return {
code: this.code,
msg: this.msg
}
}
}
util.inherits(CustomError, Error)
function HttpError (code, msg) {
if (Object.values(HTTP_CODE).indexOf(code) < 0) {
throw Error('not an invalid http code')
}
CustomError.call(this, code, msg)
}
util.inherits(HttpError, CustomError)
- бросить ошибку
router.get('/HttpError', (ctx, next) => {
throw new HttpError(HTTP_CODE.FORBIDDEN)
})
const somefunc = async (token) => {
const res = await tokenExpire(token)
if (res) {
throw new CustomError(CUSTOM_CODE.SOME_CUSTOM_ERROR)
}
// do something
}
- Промежуточное ПО koa равномерно перехватывает ошибки и возвращает соответствующий код, msg
app.use((ctx, next) => {
return next().catch((err) => {
let code = 500
let msg = 'unknown error'
if (err instanceof CustomError || err instanceof HttpError) {
const res = err.getCodeMsg()
ctx.status = err instanceof HttpError ? res.code : 200
code = res.code
msg = res.msg
} else {
console.error('err', err)
}
ctx.body = {
code,
msg
}
})
})
Через вышеприведенные 3 исключение выдается только с одной строкой кода.
Когда ты нуждаешьсявыдать http ошибкуСразуthrow new HttpError(HTTP_CODE.FORBIDDEN)
Когда ты нуждаешьсяБросает бизнес-код ошибкиСразуthrow new CustomError(CUSTOM_CODE.SOME_CUSTOM_ERROR)
.
После того, как ошибка будет выдана, она будет обработана промежуточным программным обеспечением koa. Наследуясь от Error, мы подразделяем ошибку на http
ошибки и бизнес-ошибки, чтобы можно было лучше обрабатывать возвраты ошибок.
Таким образом, мы можем изящно обрабатывать различные ошибки и исключения в нашем коде ^_^
by the way
я взял одинкоа строительные леса, который содержит изящную обработку ошибок, упомянутую в этой статье. Добро пожаловать звезда :)
Далее: Устранение неполадок с производительностью Node.js