我正在尝试使用节点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
谢谢
答案 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();
}
};