Я нашел реальную проблему.
Если вы перейдете к моему первому сообщению, вы увидите, что каждое мое репо экспортирует функцию инициализации:
1. который вызывается событием pg-обещание 'extended'
2. который принимает один параметр: контекст
3. который использует этот параметр для инициализации переменной 'pgp' в репозитории с помощью db. $ Config.pgp
Как объяснено в демоверсии , это событие происходит, когда БД загружается впервые в приложение и для каждой задачи и транзакции.
В моем случае:
В первый раз, когда происходит событие (полная инициализация приложения), параметром события 'obj' является контекст базы данных (содержащий $ config, $ pool, ...), поэтому он работает
Когда событие возникает для задачи или транзакции, параметром события 'obj' является Контекст задачи , где $ config не существует, поэтому событие не может расширить контекст моего репо. Выдается исключение «не может прочитать помощники свойств неопределенного», но оно не появляется и не вызывает сбой моего приложения, я не знаю почему, может быть перехвачено в событии. Вот почему я не мог использовать репо в транзакции.
Я изменил свой код так, как он работает:
. / Дб / 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 */
. / Дб / 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 */
. / Дб / репо / {} repoFiles .js
/* hidden for brevity */
module.exports = (db, pgpLib) => {
Database = db;
pgp = pgpLib;
Collections = createColumnsets();
return DevicesRepository;
}