我应该在哪里初始化pg-promise

问题描述 投票:14回答:2

我刚刚开始学习nodejs-postgres并找到了pg-promise包。我阅读了文档和示例,但我不明白我应该在哪里放置初始化代码?我使用Express,我有很多路线。

我必须将整个初始化(包括pg-monitor init)放到我想要查询数据库的每个文件中,或者我只需要在server.js中包含和initalize/configure它们?

如果我只在server.js中初始化它们应该包含哪些我需要db查询的文件?

换一种说法。我不清楚pg-promise和pg-monitor configuration/initalization是全球还是地方行动?

我还不清楚是否需要为每个查询创建一个db变量并结束pgp?

var db = pgp(connection);

db.query(...).then(...).catch(...).finally(**pgp.end**);
javascript pg-promise
2个回答
32
投票

您只需要初始化数据库连接一次。如果要在模块之间共享,则将其放入自己的模块文件中,如下所示:

const initOptions = {
    // initialization options;
};

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

const cn = 'postgres://username:password@host:port/database';
const db = pgp(cn);

module.exports = {
    pgp, db
};

请参阅支持的Initialization Options

更新

如果您尝试使用相同的连接详细信息创建多个数据库对象,则库将向控制台输出警告:

WARNING: Creating a duplicate database object for the same connection. at Object.<anonymous> (D:\NodeJS\tests\test2.js:14:6)

这指出您的数据库使用模式很糟糕,即您应该共享数据库对象,如上所示,而不是重新创建它。从版本6.x开始,它变得至关重要,每个数据库对象都维护着自己的连接池,因此重复这些将导致连接使用不良。


此外,没有必要导出pgp - 初始化库实例。相反,你可以这样做:

module.exports = db;

如果在某个模块中你需要使用库的根,你可以通过属性$config访问它:

const db = require('../db'); // your db module
const pgp = db.$config.pgp; // the library's root after initialization

2
投票

pgp中的“连接”实际上是一个由多个连接组成的自动管理池。每次发出请求时,都会从池中获取连接,打开,使用,然后关闭并返回池中。这就是为什么vitaly-t为你的整个应用程序创建一个pgp实例的重要原因。结束连接的唯一原因是,如果您确实使用了数据库,即您正在正常关闭应用程序。

© www.soinside.com 2019 - 2024. All rights reserved.