Ожидаются транзакции с узлом pg и циклом foreach и async - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь вставить несколько строк в PostgreSQL, используя узел pg. Я использую транзакции, но мой запрос выполняется после ответа. Я попытался выполнить асинхронное ожидание с моей функцией, но она не работает

Это моя функция

addPersons = async (req, res) => {
try {
    await db.query("BEGIN");
    req.body.forEach((person, index) => {
      if (person.id) {
        try {
          await db.query("ROLLBACK");
        } catch (error) {
          console.error("Error rolling back client", err.stack);
        }
        return res
          .status(Error_code.IdNotFound.code)
          .send(Error_code.IdNotFound);
      }
      const query = `update person set 
        name = ${person.name},
        where id = '${
          person.id
        }'`;
      try {
        await db.query(query);
      } catch (error) {
        try {
          await db.query("ROLLBACK");
        } catch (error) {
          console.error("Error rolling back client", err.stack);
        }
        return res.status(500).send(err);
      }
    })
    await db.query("COMMIT");
    res.status(Error_code.Successfull.code).send(Error_code.Successfull);
  } catch (error) {
    try {
      db.query("ROLLBACK");
    } catch (error) {
      console.error("Error rolling back client", err.stack);
    }
    return res
      .status(Error_code.UnableToBeginTransaction.code)
      .send(Error_code.UnableToBeginTransaction);
  }
}

Я также пытался вызвать эту функцию из другой функции и использовать foreach для этой функции, но когда всякий раз, когда код обнаруживает ожидание или обратный вызов во второй функции, он не ждет и не возвращается к первой функции. Как я могу запустить этот код, чтобы добавить свои данные в PostgreSQL с транзакциями

Спасибо

1 Ответ

0 голосов
/ 28 ноября 2018

Так как это помечено node-postgres, я предлагаю вам основать свой код на клиенте из пула с примером async / await в документации node-postgres. Я также предлагаю использовать параметризованных запросов или конструктор запросов, например mongo-sql . (Их много, но этот мой любимый. ?)

Это может выглядеть примерно так:

const { Pool } = require("pg");
const pool = new Pool();

const addPersons = async (req, res) => {
  const db = await pool.connect();
  try {
    await db.query("BEGIN");
    const query = `update person set name = $1 where id = $2;`;
    // Promise.all() may improve performance here, but I'm not sure if it's safe
    // or even useful in the case of transactions.
    for (const person of req.body) {
      await db.query(query, [person.name, person.id]);
    }
    await db.query("COMMIT");
  } catch (e) {
    await db.query("ROLLBACK");
    throw e;
  } finally {
    db.release();
  }
};
...