gpt4 book ai didi

node.js - 如何在交易中使用其他仓库

转载 作者:太空宇宙 更新时间:2023-11-04 02:45:08 25 4
gpt4 key购买 nike

我有几个带有方法的存储库,其中一些方法使用事务 (.tx)。例如,在下面的 DevicesRepository 中,“add”方法必须插入一个新设备,这意味着:1.插入一个System并返回ID(SystemsRepository)2.插入带有returner systemId的设备并获取新的id3.插入使用deviceId的其他片段(其他repos)

我的问题是,在该事务中我不知道如何访问其他存储库方法。我可以使用我的数据库对象中的其他存储库(Database.systems.add、Database.OtherRepo.add、[...]),但如果我这样做

tx doc

When invoked on the root Database object, the method allocates the connection from the pool, executes the callback, and once finished - releases the connection back to the pool. However, when invoked inside another task or transaction, the method reuses the parent connection.

task doc

When executing more than one request at a time, one should allocate and release the connection only once, while executing all the required queries within the same connection session. More importantly, a transaction can only work within a single connection.

谢谢! :)

P.S:我可以添加如何初始化数据库和存储库

./db/repos/devices.js

'use strict';

var Database = null, pgp = null, Collections = null;

async function add(params) {
// I can use Database.systems.add
return Database.tx('Insert-New-Device', async function(transaction) {
let device = params.data.device;

const system = await transaction.systems.add(params);
device.systemid = system.systemId;

const query = pgp.helpers.insert(device, Collections.insert);
query += " RETURNING deviceId";
device.deviceId = await transaction.one(query);

const OtherRepoInsert = await transaction.otherRepos.add(params);
device.otherRepos.id = OtherRepoInsert.otherReposId;

return device
})
.then(data => { return data; })
.catch(ex => { throw new Error(ex); });
}

function createColumnsets() { /* hidden for brevity (almost the same as the pg-promise-demo */ }

const DevicesRepository = {
add: add
};


module.exports = (db) => {
Database = db;
pgp = db.$config.pgp;
Collections = createColumnsets();

return DevicesRepository;
}

./db/repos/systems.js

'use strict';

var Database = null, pgp = null, Collections = null;

async function add(params) {
var system = params.data.system;
system.archid=2;
system.distributionid=3;

var query = pgp.helpers.insert(system, Collections.insert);
if(params.return) query += " RETURNING *";

return Database.any(query)
.then(data => { return data; })
.catch(ex => { throw new Error(ex); });
}

function createColumnsets() { /* hidden for brevity (almost the same as the pg-promise-demo */ }

const SystemsRepository = {
add: add
};

module.exports = (db) => {
Database = db;
pgp = db.$config.pgp;
Collections = createColumnsets();

return SystemsRepository;
}

最佳答案

我发现了真正的问题。

如果您转到我的第一篇文章,您可以看到我的每个存储库都导出一个初始化函数:1. 由 pg-promise 'extend' 事件调用2. 它需要一个参数:上下文3. 使用此参数通过 db.$config.pgp 初始化存储库中的“pgp”变量

demo 中所述,当第一次在 appl 中以及每个任务和事务中加载数据库时,会发生此事件。

就我而言:事件第一次发生时(完整的应用程序初始化),事件的参数“obj”是 database context (包含 $config,$pool,...)所以它可以工作当任务或事务发生事件时,事件的参数“obj”是 Task context ,其中 $config 不存在,因此事件无法使用我的存储库扩展上下文。抛出异常“无法读取未定义的属性助手”,但没有出现,也不会导致我的应用程序崩溃,我不知道为什么,可能是在事件中捕获的。这就是为什么我无法在交易中使用我的存储库。

我像这样修改了我的代码并且它有效:

./db/index.js

'use strict';
/* hidden for brevity */
// pg-promise initialization options:
const initOptions = {
promiseLib: promise,
extend(obj, dc) {
obj.roles = repos.Roles(obj, pgp);
obj.shells = repos.Shells(obj, pgp);
obj.systems = repos.Systems(obj, pgp);
obj.devices = repos.Devices(obj, pgp);
}
};

const pgp = require('pg-promise')(initOptions);
const db = pgp(config);

/* hidden for brevity */

./db/index.js

'use strict';
/* hidden for brevity */
// pg-promise initialization options:
const initOptions = {
promiseLib: promise,
extend(obj, dc) {
obj.roles = repos.Roles(obj, pgp);
obj.shells = repos.Shells(obj, pgp);
obj.systems = repos.Systems(obj, pgp);
obj.devices = repos.Devices(obj, pgp);
}
};

const pgp = require('pg-promise')(initOptions);
const db = pgp(config);

/* hidden for brevity */

./db/repos/{repoFiles}.js

/* hidden for brevity */
module.exports = (db, pgpLib) => {
Database = db;
pgp = pgpLib;
Collections = createColumnsets();

return DevicesRepository;
}

关于node.js - 如何在交易中使用其他仓库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56898693/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com