#node.js #postgresql #api #rest #express
#node.js #postgresql #API #остальное #экспресс
Вопрос:
Я пытаюсь написать TRANSACTION
with node-postgres
в экспресс-API. [Приведенный ниже код работает так, как и предполагалось, в основном ищет то, что следует исправить / изменить]
Это будет POST
запрос, который создает «транзакцию» и обновляет запись в отдельной таблице. Итак, в основном пара запросов одновременно. Ниже приведен код:
Для контекста — db
это пул соединений с базой данных postgres.
// @desc Add a Transaction
// @route DELETE /api/v1/envelopes/:id/transactions
exports.addEnvelopeTransaction = async (req, res) => {
const { id } = req.params;
const { title, amount } = req.body;
const date = new Date();
const envelopeQuery = "SELECT * FROM envelopes WHERE envelopes.id = $1";
const transactionQuery = "INSERT INTO transactions(title, amount, date, envelope_id)VALUES($1, $2, $3, $4) RETURNING *";
const updateEnvQuery = "UPDATE envelopes SET budget = budget - $1 WHERE id = $2 RETURNING *";
try {
// Use SQL TRANSACTION
await db.query('BEGIN');
const envelope = await db.query(envelopeQuery, [id])
if (envelope.rowCount < 1) {
return res.status(404).send({
message: "No envelope information found",
});
};
const newTransaction = await db.query(transactionQuery, [title, amount, date, id]);
await db.query(updateEnvQuery, [amount, id]);
await db.query('COMMIT');
res.status(201).send({
status: 'Success',
message: 'New transaction created',
data: newTransaction.rows[0],
});
} catch (err) {
await db.query('ROLLBACK');
return res.status(500).send({
error: err.message
});
}
};
Я чувствую здесь какой-то плохой код, я не могу точно сказать, использую ли я BEGIN
, COMMIT
, и ROLLBACK
в соответствующих местах.
Что я должен изменить?
Комментарии:
1. косметическая очистка
2. Это может продолжаться codereview.stackexchange.com
3. Сообщение было перекрестно размещено на CR .
Ответ №1:
Сам код работает, но, как вы уже указали, он не чистый.
Я бы посоветовал вам использовать какой-то конструктор запросов (например, облегченная библиотека knex.js (http://knexjs.org /) — пример работы с транзакциями можно найти здесь -> http://knexjs.org/#Builder-transacting ) вместо node-postgres
библиотеки.