我应该在哪里初始化pg promise
Where should I initialize pg-promise
我刚开始学习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
};
请参阅支持的初始化选项。
更新-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
更新-2
一些开发人员报告(问题#175),某些框架,如NextJS,设法以打破单例模式的方式加载模块,这导致数据库模块加载不止一次,并产生duplicate database
警告,尽管从NodeJS的角度来看,它应该只是工作的。
以下是针对此类集成问题的解决方案,通过使用Symbol将singleton强制到全局范围中。让我们创建一个可重用的助手来创建singleton。。。
// 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();
这将确保持久的单例模式。
pgp中的"连接"实际上是多个连接的自动管理池。每次提出请求时,都会从池中获取一个连接,打开、使用,然后关闭并返回到池中。这就是为什么vitaly-t只为整个应用程序创建一个pgp实例这么重要的原因。结束连接的唯一原因是,如果你确实已经使用完数据库,即你正在优雅地关闭你的应用程序。
- 使用promise和mongoose对文档进行排序
- 测试Angular Service解决错误回调中的promise
- 节点协同与生成器和Promise并行流量控制
- 根据是否解析了 Promise 从函数返回值
- 将一个方法转换为promise:Nodejs
- 函数在promise被解析后被调用,但Jasmine未通过测试.为什么?
- js promise没有正确关闭
- Angularjs使用“;这个“;promise内的关键字回调
- AngularJS和promise值在调用本地函数时的效果-未定义
- 在ES6 Promise中,我应该在解决/拒绝之前使用return吗
- 以同步方式获取Javascript Promise的值
- NodeJS和pg promise,捕获PostgreSQL异常
- AngularJS使用http进行promise处理
- Angular promise return"未定义的“;值.NET MVC
- Pg承诺性能提升:在冲突中
- Promise函数在.then之后未运行函数化
- PG-promise为选择查询创建自定义过滤器
- 我应该在哪里初始化pg promise
- for循环中的Promises / promise.所有,使用PSQL (pg-promise)在节点
- 无法在NodeJS中使用pg-promise -“关系不存在”查询PostgreSQL数据库