Node.js 未处理的PromisejectionWarning:TypeError:无法读取属性';连接';空的
我正在尝试连接到我的Postgres DB,只是想看看我是否可以连接,我有一个条目在里面。但每当我尝试连接时,就会出现connect null错误,为什么会这样 我的数据库模型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
'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()
}