Я занимаюсь рефакторингом своего nodejs кода. Я реализую транзакции с использованием node- postgres. Теперь мой код выглядит так:
const controller = async (req, res, next) => {
const client = await pool.connect()
try {
// get the user ID out of the params in the URL
const { user_id } = req.params
let query, values, result
try {
await client.query('BEGIN')
} catch (err) {
throw new CustomError(err)
}
try {
query = 'QUERY_1'
values = ['VALUES_1']
result = await client.query(query, values)
} catch (err) {
throw new CustomError(err)
}
// handle some stuff
try {
query = 'QUERY_2'
values = ['VALUES_2']
result = await client.query(query, values)
} catch (err) {
throw new CustomError(err)
}
// handle some more stuff
try {
await client.query('COMMIT')
} catch (err) {
throw new CustomError(err)
}
return res.status(200).json({ response: 'ok' })
} catch (err) {
await client.query('ROLLBACK')
return next(new CustomHandleError(400, 'something_went_wrong'))
} finally {
client.release()
}
}
Этот код работает, но у меня есть несколько вопросов. Я новичок в nodejs.
1) В моем блоке «finally» я возвращаю клиента в пул. Но когда все в порядке, я возвращаю ответ в блоке try. В сети я прочитал, что блок 'finally' выполняется ВСЕГДА, так что можно ли вернуть (хороший) ответ в блоке try и освободить клиента в блоке finally?
2) Это нормально (или это анти-шаблон) для вложения нескольких блоков try catch. Причина в том, что node- postgres выдает ошибки, но я хочу вернуть все ошибки пользовательскому обработчику ошибок, поэтому я сначала перехватываю эти ошибки, а затем снова бросаю их в свой обработчик CustomError.
Заранее спасибо !