我才刚刚开始学习nodejs-postgres
并找到了pg-promise
包。
我阅读了文档和示例,但我不知道应该将初始化代码放在哪里?我使用Express,路线很多。
我必须将整个初始化(包括pg-monitor
init)放在要查询数据库的每个文件中,或者仅在server.js中包括它们并对其进行initalize/configure
?
如果仅在server.js中初始化它们,我应该在需要数据库查询的地方包含其他文件吗?
换一种说法。我不清楚pg-promise和pg-monitor configuration/initalization
是全局操作还是局部操作?
还不清楚是否需要为每个查询创建db变量并结束pgp?
var db = pgp(connection);
db.query(...).then(...).catch(...).finally(**pgp.end**);
最佳答案
您只需初始化一次数据库连接。如果要在模块之间共享它,则将其放入自己的模块文件中,如下所示:
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。UPDATE-1
而且,如果您尝试创建多个具有相同连接详细信息的数据库对象,该库将向控制台输出警告:
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
UPDATE-2 一些开发人员已经报告(issue #175)某些框架,例如NextJS设法以破坏单例模式的方式加载模块,这导致数据库模块被多次加载,并产生
duplicate database
警告,即使从NodeJS角度来看也是如此。认为它应该可以正常工作。下面是使用Symbol将单例强制进入全局范围的解决方案,可解决此类集成问题。让我们创建一个可重用的帮助器来创建单例...
// generic singleton creator:
export function createSingleton<T>(name: string, create: () => T): T {
const s = Symbol.for(name);
let scope = (global as any)[s];
if (!scope) {
scope = {...create()};
(global as any)[s] = scope;
}
return scope;
}
使用上面的帮助程序,您可以将TypeScript数据库文件修改为:import * as pgLib from 'pg-promise';
const pgp = pgLib(/* initialization options */);
interface IDatabaseScope {
db: pgLib.IDatabase<any>;
pgp: pgLib.IMain;
}
export function getDB(): IDatabaseScope {
return createSingleton<IDatabaseScope>('my-app-db-space', () => {
return {
db: pgp('my-connect-string'),
pgp
};
});
}
然后,在使用数据库的任何文件的开头,您都可以这样做:import {getDB} from './db';
const {db, pgp} = getDB();
这将确保持久的单例模式。关于javascript - 我应该在哪里初始化pg-promise,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34382796/