在启动应用程序时validation与pg-promise的数据库连接

我正在构build一个使用pg-promise模块连接到postgres数据库的快速应用程序。

我想确保启动应用程序服务器时数据库连接成功。 换句话说,如果连接到数据库失败,我想抛出一个错误。

我的server.js文件如下:

const express = require("express"); const databaseConfig= { "host": "localhost", "port": 5432, "database": "library_app", "user": "postgres" }; const pgp = require("pg-promise")({}); const db = pgp(databaseConfig); const app = express(); const port = 5000; app.listen(port, (err) => { console.log(`running server on port: ${port}`); }); 

无论数据库连接是否有效,当前的configuration都将启动快速服务器,这不是我想要的行为。

我尝试浏览文档,但找不到解决scheme。 我也试过const db = pgp(databaseConfig).catch((err) => { // blow up }); ,但这不起作用,因为pgp没有返回承诺。

       

网上收集的解决方案 "在启动应用程序时validation与pg-promise的数据库连接"

我是pg-promise的作者;)这不是第一次问这个问题,所以我在这里给它一个详细的解释。

当你像这样实例化一个新的数据库对象时:

 const db = pgp(connection); 

…它所做的一切 – 创build对象,但它不尝试连接。 该库build立在连接池之上,只有实际的查询方法请求池中的连接。

从官方文档 :

对象db代表数据库协议,数据库连接延迟,即只有实际的查询方法获取和释放连接。 因此,每个连接详细信息只能创build一个全局/共享db对象。

但是,您可以通过使用方法connect来请求库连接而不执行任何查询,如下所示。

虽然这种方法不再是链接查询的推荐方式,但自从支持Tasks (作为一种更安全的方法)以来,它仍然可以方便地检查连接。

我从我自己的post中复制了这个例子: https : //github.com/vitaly-t/pg-promise/issues/81

下面是以两种方式同时做的一个例子,所以你可以select你喜欢的任何一种方法。

 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 => { obj.done(); // success, release the connection; }) .catch(error => { console.log('ERROR:', error.message || error); }); 

输出:

CN: postgresql://userName:########@host:port/database EVENT: getaddrinfo ENOTFOUND host host:5432 ERROR: getaddrinfo ENOTFOUND host host:5432

库中的每个错误首先通过全局错误事件处理程序报告,然后才在相应的.catch处理程序中报告错误。

替代

不用手动build立连接,只需执行一种对于有效连接总是成功的查询types,如下所示:

 db.proc('version') .then(data => { // SUCCESS // data.version = // 'PostgreSQL 9.5.1, compiled by Visual C++ build 1800, 64-bit' }) .catch(error => { // connection-related error }); 

API链接:

  • 方法处理
  • 方法连接
  • 事件错误