Создание транзакции с помощью node-pg и Express?

#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 библиотеки.