Node.js 未处理的PromisejectionWarning:TypeError:无法读取属性';连接';空的

Node.js 未处理的PromisejectionWarning:TypeError:无法读取属性';连接';空的,node.js,database,postgresql,typescript,connection,Node.js,Database,Postgresql,Typescript,Connection,我正在尝试连接到我的Postgres DB,只是想看看我是否可以连接,我有一个条目在里面。但每当我尝试连接时,就会出现connect null错误,为什么会这样 我的数据库模型 'use strict'; import { Pool, Client } from 'pg'; export default class Postgresql { private pool: Pool; constructor(private datab

我正在尝试连接到我的Postgres DB,只是想看看我是否可以连接,我有一个条目在里面。但每当我尝试连接时,就会出现connect null错误,为什么会这样

我的数据库模型


    '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));
        })

    }


我的环境变量,我反复检查它们是否正确,但无论如何我会发布。这是我第一次尝试使用env var连接到数据库,并通过服务进行连接,因此如果我做错了什么,请告诉我


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


(节点:11020)未处理的PromisejectionWarning:TypeError:无法读取null的属性“connect”
反对。(C:\Users\ENGU3002\Documents\Template\src\app\services\database.service.ts:20:38)
在Generator.next()处
在C:\Users\ENGU3002\Documents\Template\node\u modules\tslib\tslib.js:110:75
在新的承诺()
at Object.\uu waiter(C:\Users\ENGU3002\Documents\Template\node\u modules\tslib\tslib.js:106:16)
在Object.execute(C:\Users\ENGU3002\Documents\Template\src\app\services\database.service.ts:16:24)
在C:\Users\ENGU3002\Documents\Template\src\app\server.ts:20:25
在Generator.next()处
在C:\Users\ENGU3002\Documents\Template\node\u modules\tslib\tslib.js:110:75
在新的承诺()
(节点:11020)未处理的PromisejectionWarning:未处理的承诺拒绝。此错误源于在没有catch块的异步函数中抛出,或者拒绝未使用.catch()处理的承诺。(拒绝id:1)
(节点:11020)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。

问题在于您的databaseService.init()是异步的,但您没有等待它,因此对databaseService.execute的调用发生在init()返回的承诺解析之前

你要么打电话

await databaseService.init()

然后在内部执行查询

与此不直接相关,但如果将函数声明为异步,则任何返回值都将自动包含在承诺中,因此不需要显式声明承诺,这使代码更易于阅读,也更容易发现类似问题。例如,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()
    }

问题是您的databaseService.init()是异步的,但您没有等待它,因此对databaseService.execute的调用发生在init()返回的承诺解析之前

你要么打电话

await databaseService.init()

然后在内部执行查询

与此不直接相关,但如果将函数声明为异步,则任何返回值都将自动包含在承诺中,因此不需要显式声明承诺,这使代码更易于阅读,也更容易发现类似问题。例如,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()
    }

确切的消息是什么?报告错误的行是什么?快速浏览一下,我看不到这个.pool在databaseService中的任何地方被初始化。编辑帖子以显示错误代码,然后我将databaseService.init()放入其中;在server.js中创建实例的确切消息是什么,报告错误的行是什么?快速浏览一下,我看不到这个.pool在databaseService中的任何地方被初始化。编辑帖子以显示错误代码,然后我将databaseService.init()放入其中;在server.js中创建实例这两个调用仍然在同一行上给我一个错误,我确实将init方法的方式更改为您提到的方式。我仍然习惯于使用wait,但这让我更了解它,谢谢。尽管init方法看起来有点不同,但异步方法位于不同的位置。错误消息仍然是一样的,尽管这两个调用仍然在同一行上给我一个错误,我确实将init方法的方式更改为您提到的方式。我仍然习惯于使用wait,但这让我更了解它,谢谢。尽管init方法看起来有点不同,但异步方法位于不同的位置。但错误消息仍然是相同的
databaseService.init().then(....)
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()
    }