带有回调或 async/await 的 node-postgres 事务?
node-postgres transactions with callbacks or async/await?
我是运行 Node 7.6.0,支持async/await。 node-postgres 客户端池支持 async/await,并且有一个很好的示例 here. However, the example for transactions in node-postgres (here) 使用回调而不是 async/await。尽管有这个例子,我想我会在快速测试中尝试使用 async/await 进行交易:
let client = null;
try {
client = await this.pool.connect();
} catch (error) {
console.log('A client pool error occurred:', error);
return error;
}
try {
await client.query('BEGIN');
await client.query('UPDATE foo SET bar = 1');
await client.query('UPDATE bar SET foo = 2');
await client.query('COMMIT');
} catch (error) {
try {
await client.query('ROLLBACK');
} catch (rollbackError) {
console.log('A rollback error occurred:', rollbackError);
}
console.log('An error occurred:', error);
return error;
} finally {
client.release();
}
return 'Success!';
这似乎工作得很好,但是 I was told node-postgres 贡献者认为这是个坏主意。不幸的是,他没有花时间解释 为什么 这是个坏主意 — 他只是说要在 Stack Overflow 上寻求答案。
为什么在 node-postgres 中使用 async/await 执行事务而不是回调是个坏主意?
node-postgres (brianc) 的创建者非常慷慨地对我在 GitHub 上的原始问题做出了很好的回答。简短的回答是 不是 与 async/await
进行交易的坏主意。
在此处查看他的完整回复:https://github.com/brianc/node-postgres/issues/1252#issuecomment-293899088
除了 Rob Johansen 的 post 我还想分享我的 TypeScript 解决方案:
import { PoolClient } from "pg"
import { pool } from "../database"
const tx = async (callback: (client: PoolClient) => void) => {
const client = await pool.connect();
try {
await client.query('BEGIN')
try {
await callback(client)
await client.query('COMMIT')
} catch (e) {
await client.query('ROLLBACK')
}
} finally {
client.release()
}
}
export { tx }
用法:
let result;
await tx(async client => {
const { rows } = await client.query<{ cnt: string }>('SELECT COUNT(*) AS cnt FROM users WHERE username = ', [username]);
result = parseInt(rows[0].cnt) > 0;
});
我是运行 Node 7.6.0,支持async/await。 node-postgres 客户端池支持 async/await,并且有一个很好的示例 here. However, the example for transactions in node-postgres (here) 使用回调而不是 async/await。尽管有这个例子,我想我会在快速测试中尝试使用 async/await 进行交易:
let client = null;
try {
client = await this.pool.connect();
} catch (error) {
console.log('A client pool error occurred:', error);
return error;
}
try {
await client.query('BEGIN');
await client.query('UPDATE foo SET bar = 1');
await client.query('UPDATE bar SET foo = 2');
await client.query('COMMIT');
} catch (error) {
try {
await client.query('ROLLBACK');
} catch (rollbackError) {
console.log('A rollback error occurred:', rollbackError);
}
console.log('An error occurred:', error);
return error;
} finally {
client.release();
}
return 'Success!';
这似乎工作得很好,但是 I was told node-postgres 贡献者认为这是个坏主意。不幸的是,他没有花时间解释 为什么 这是个坏主意 — 他只是说要在 Stack Overflow 上寻求答案。
为什么在 node-postgres 中使用 async/await 执行事务而不是回调是个坏主意?
node-postgres (brianc) 的创建者非常慷慨地对我在 GitHub 上的原始问题做出了很好的回答。简短的回答是 不是 与 async/await
进行交易的坏主意。
在此处查看他的完整回复:https://github.com/brianc/node-postgres/issues/1252#issuecomment-293899088
除了 Rob Johansen 的 post 我还想分享我的 TypeScript 解决方案:
import { PoolClient } from "pg"
import { pool } from "../database"
const tx = async (callback: (client: PoolClient) => void) => {
const client = await pool.connect();
try {
await client.query('BEGIN')
try {
await callback(client)
await client.query('COMMIT')
} catch (e) {
await client.query('ROLLBACK')
}
} finally {
client.release()
}
}
export { tx }
用法:
let result;
await tx(async client => {
const { rows } = await client.query<{ cnt: string }>('SELECT COUNT(*) AS cnt FROM users WHERE username = ', [username]);
result = parseInt(rows[0].cnt) > 0;
});