我是pg-promise的作者;)这不是第一次问这个问题,因此我在这里给它一个详细的解释。
当您像这样实例化一个新的数据库对象时:
const db = pgp(connection);
…所有操作-创建对象,但不尝试连接。该库建立在连接池的顶部,并且只有实际的查询方法才请求连接池的连接。
从官方文档中:
对象
db表示数据库协议,具有惰性数据库连接,即只有实际的查询方法才能获取并释放该连接。因此,db每个连接详细信息仅应创建一个全局/共享对象。
但是,可以通过调用方法connect来强制建立连接,如进一步所示。尽管不建议使用此方法来链接查询(应该使用Tasks),但通常可以方便地检查连接。
我从自己的帖子中复制了该示例:https :
//github.com/vitaly-t/pg-promise/issues/81
下面是同时使用两种方法进行操作的示例,因此您可以选择更喜欢的一种方法。
const initOptions = { // global event notification; error(error, e) { if (e.cn) { // A connection-related error; // // Connections are reported back with the password hashed, // for safe errors logging, without exposing passwords. console.log('CN:', e.cn); console.log('EVENT:', error.message || error); } }};const pgp = require('pg-promise')(initOptions);// using an invalid connection string:const db = pgp('postgresql://userName:password@host:port/database');db.connect() .then(obj => { // Can check the server version here (pg-promise v10.1.0+): const serverVersion = obj.client.serverVersion; obj.done(); // success, release the connection; }) .catch(error => { console.log('ERROR:', error.message || error);});输出:
CN: postgresql://userName:########@host:port/database EVENT: getaddrinfoENOTFOUND host host:5432 ERROR: getaddrinfo ENOTFOUND host host:5432
首先通过全局错误事件处理程序报告库中的每个错误,然后才在相应的
.catch处理程序中报告错误。
#替代
无需手动建立连接,您只需执行一种对于有效连接始终成功的查询类型,如下所示:
db.func('version') .then(data => { // SUCCESS // data.version = // 'PostgreSQL 9.5.1, compiled by Visual C++ build 1800, 64-bit' }) .catch(error => { // connection-related error });但是,该示例
connect具有优点,例如不需要执行任何查询,并且它以简单的形式提供了服务器版本。
API链接:
- 方法功能
- 方法连接
- 事件错误



