在启动应用程序时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
没有返回承诺。
我是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链接:
- 方法处理
- 方法连接
- 事件错误