Проблема с подключением PostgreSQL (через pg-обещание)

Я создал следующее db_postgres сервис, который работает отлично.

db_postgres.service.js

"use strict";

const Promise = require('bluebird');

const initOptions = {
    promiseLib: Promise,
    capSQL:     true
};

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

const cn_postgres = {
    host:     'localhost',
    port:      5432,
    database: 'db_name',
    user:     'user_name',
    password: 'user_password',
    ...
};

var db_postgres = null;

module.exports = {
    name: "db_postgres",
    version: "",
    mixins: [],
    hooks: {},
    settings: {},
    metadata: {},
    dependencies: [],

    actions: {
        getUsers() {
            db_postgres.any('SELECT * FROM user')
                .then(data => {
                    return console.log(data);
                })
                .catch(error => {
                    return console.log(error);
                });
        },
    },

    methods: {},
    events: {},
    created() {},

    async started() {
        return db_postgres = await pgp(cn_postgres);
    },

    async stopped() {
        if (db_postgres) {
            return db_postgres.$pool.end();
        }
    }
}

Случай:

  • У меня большое количество действий.
  • Я хотел бы создать больше экземпляров этого сервиса, но, к сожалению, это невозможно, так как я получаю предупреждение / ошибку об установлении нового соединения, которое уже существует.
  • Я не хочу использовать какое-либо решение на основе ORM.
  • Я хочу избегать использования какой-либо функции-оболочки и поддерживать как можно более СУХОЙ способ.

Вопрос: Какой самый простой и легкий способ сделать это?

Мои усилия:

  • Я удалил getUsers() действие от db_postgres оказание услуг.
  • Я создал новый queries обслуживание следующим образом:

queries.service.js

"use strict";

module.exports = {
    name: "queries",
    version: "",
    mixins: [db_postgres],
    hooks: {},
    settings: {},
    metadata: {},
    dependencies: ["db_postgres"],

    actions: {
        getUsers() {
            db_postgres.any('SELECT * FROM user')
                .then(data => {
                    return console.log(data);
                })
                .catch(error => {
                    return console.log(error);
                });
        },
    },

    methods: {},
    events: {},
    created() {},
    async started() {},
    async stopped() {}
}

Проблемы:

  • Когда я добавлю "db_postgres" в dependencies и беги npm run dev т.е. moleculer-runner --env --hot --repl services, db_postgres сервис регистрируется нормально. Но, queries Сервис никогда не бывает. Поток в терминале останавливается, и курсор мигает. Зачем?
  • Далее, когда я также добавлю db_postgres в mixins Я получаю следующую ошибку Failed to load service '.../services/queries.service.js' ReferenceError: db_postgres is not defined Зачем?

Тиа

1 ответ

Вы должны загрузить db_postgres с require и использовать как mixin, а не как зависимость.

Другие вопросы по тегам