UnhandledPromiseRejectionWarning: TypeError: Невозможно прочитать свойство 'connect' из null - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь подключиться к моей Postgres БД, просто чтобы посмотреть, смогу ли я подключиться, у меня есть одна запись в ней. Но всякий раз, когда я пытаюсь подключиться, я получаю сообщение об ошибке подключения, почему это так?

Моя модель базы данных


    'use strict';

    import { Pool, Client } from 'pg';

    export default class Postgresql {

        private pool: Pool;

        constructor(private database: string, private host: string, private port: string, private user: string, private password: string) { };
        /* Create a PostgreSQL DB instance */
        connect = (): Promise<Pool> => new Promise((resolve, reject) => {
            this.pool = new Pool({
                database: this.database,
                host: this.host,
                port: Number(this.port),
                user: this.user,
                password: this.password
            });

            this.pool.connect().then(() => {
                resolve(this.pool);
            }).catch(err => reject(err));
        })

    }


Моя служба базы данных, которая импортирует модель


    import Postgresql from "@root/src/app/models/database.model";

    const databaseService: {

        pool: Postgresql['pool'];
        init: () => Promise<string>;
        execute: (query: string, params: any, next?: any) => Promise<any>;
    } = {
        pool: null,
        init: () =>
            new Promise((resolve, reject) => {
                if (!databaseService.pool) new Postgresql(process.env.DATABASE, process.env.DATABASEHOST,
                    process.env.DATABASEPORT, process.env.DATABASEUSER, process.env.DATABASESECRET)
                    .connect()
                    .then((pool: Postgresql['pool']) => databaseService.pool = pool)
                    .catch((err: Error) => reject(err));
                resolve();
            }),
        async execute(query, params, next?) {
            let client = await this.pool.connect();
            try {
                const result = await client.query(query, params);
                console.log(result);
                next(null, result);
            } catch (e) {
                next(e, null);
            } finally {
                client.release();
            }
        }
    }

    export default databaseService;

вызов БД с сервера. js

        databaseService.init();
        let query = "SELECT * FROM ?";
        let params = "postgres"
        databaseService.execute(query, params);

и мой env var, я дважды проверил, что они были правильными, но все равно постил. я впервые пытаюсь подключиться к БД с помощью env var и сделать это через службу, поэтому, если я делаю что-то не так, пожалуйста, дайте мне знать


    DATABASE=postgres
    DATABASEHOST=localhost
    DATABASEPORT=5432
    DATABASEUSER=postgres
    DATABASESECRET=password


    (node:11020) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'connect' of null
    at Object.<anonymous> (C:\Users\ENGU3002\Documents\Template\src\app\services\database.service.ts:20:38)
    at Generator.next (<anonymous>)
    at C:\Users\ENGU3002\Documents\Template\node_modules\tslib\tslib.js:110:75
    at new Promise (<anonymous>)
    at Object.__awaiter (C:\Users\ENGU3002\Documents\Template\node_modules\tslib\tslib.js:106:16)
    at Object.execute (C:\Users\ENGU3002\Documents\Template\src\app\services\database.service.ts:16:24)
    at C:\Users\ENGU3002\Documents\Template\src\app\server.ts:20:25
    at Generator.next (<anonymous>)
    at C:\Users\ENGU3002\Documents\Template\node_modules\tslib\tslib.js:110:75
    at new Promise (<anonymous>)
(node:11020) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:11020) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

1 Ответ

0 голосов
/ 06 февраля 2020

Проблема в том, что ваш databaseService.init () является asyn c, но вы не ожидаете его, поэтому происходит вызов databaseService.execute до разрешения обещания, возвращаемого init ().

Вам либо нужно вызвать

await databaseService.init()

или

databaseService.init().then(....)

и выполнить запрос внутри функции then.

Не имеет к этому непосредственного отношения, но если вы объявите функцию asyn c любое возвращаемое значение автоматически будет заключено в обещание, поэтому вам не нужно явно объявлять обещания, что облегчает чтение кода и обнаружение подобных проблем. например, метод init может выглядеть примерно так:

init: async () => {
    if (!databaseService.pool) {
        databaseService.pool = await new Postgresql(
            process.env.DATABASE,
            process.env.DATABASEHOST,
            process.env.DATABASEPORT,
            process.env.DATABASEUSER,
            process.env.DATABASESECRET
        ).connect()
    }
...