与节点pg和foreach循环以及异步等待的交易

时间:2018-11-19 06:30:54

标签: node.js postgresql node-postgres

我正在尝试使用节点pg在PostgreSQL中插入多行。我正在使用事务,但是响应后我的查询正在执行。我尝试使用我的函数进行异步等待,但无法正常工作

这是我的职责

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 :(得分:0)

由于它被标记为node-postgres,因此建议您将代码基于node-postgres文档中的A pooled client with async/await示例。我还建议您使用parameterized queries或诸如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();
  }
};