Node.js 启动应用程序时验证与pg promise的数据库连接

Node.js 启动应用程序时验证与pg promise的数据库连接,node.js,postgresql,express,pg-promise,Node.js,Postgresql,Express,Pg Promise,我正在构建一个express应用程序,它使用该模块连接到postgres数据库 我希望在启动应用程序服务器时确保数据库连接成功。换句话说,如果与数据库的连接失败,我想抛出一个错误 我的server.js文件如下: const express = require("express"); const databaseConfig= { "host": "localhost", "port": 5432, "database": "library_app", "user": "pos

我正在构建一个express应用程序,它使用该模块连接到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}`);
});
无论数据库连接是否有效,当前配置都将启动express server,这不是我想要的行为

我试图浏览文档,但找不到解决方案。我也试过了

const db = pgp(databaseConfig).catch((err) => { // blow up });
但这并没有起作用,因为pgp并没有回报承诺。

我是;)这不是第一次问这个问题,所以我在这里给出了详细的解释

当您实例化一个新的数据库对象时,如下所示:

const db = pgp(connection);
…它所做的一切-创建对象,但不尝试连接。该库构建在连接池的顶部,只有实际的查询方法从连接池请求连接

:

对象
db
表示数据库协议,具有惰性数据库连接,即只有实际的查询方法获取并释放连接。因此,每个连接详细信息只能创建一个全局/共享
db
对象

但是,您可以通过调用方法强制连接,如下图所示。虽然这种方法不是链接查询的推荐方法(应该使用这种方法),但它通常可以方便地检查连接

我从自己的帖子中复制了这个例子:

下面是一个同时以两种方式进行的示例,因此您可以选择您更喜欢的方法

const initOptions={
//全球事件通知;
错误(错误,e){
国际单项体育联合会(e.cn){
//与连接相关的错误;
//
//连接被报告回来,密码被散列,
//用于安全的错误记录,无需公开密码。
console.log('CN:',e.CN);
console.log('EVENT:',error.message | | error);
}
}
};
const pgp=require('pg-promise')(初始选项);
//使用无效的连接字符串:
常数db=pgp('postgresql://userName:password@主机:端口/数据库';
db.connect()
.然后(obj=>{
//可以在此处检查服务器版本(pg promise v10.1.0+):
const serverVersion=obj.client.serverVersion;
obj.done();//成功,释放连接;
})
.catch(错误=>{
console.log('ERROR:',ERROR.message | | ERROR);
});
产出:

CN:postgresql://userName:########@主机:端口/数据库事件:getaddrinfo ENOTFOUND主机:5432错误:getaddrinfo ENOTFOUND主机:5432

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

更新 测试连接的现代方法+一步到位获取服务器版本:

//测试连接并返回Postgres服务器版本,
//如果成功;或因连接错误而拒绝:
异步函数testConnection(){
const c=wait db.connect();//尝试连接
c、 done();//成功,释放连接
返回c.client.serverVersion;//返回服务器版本
}
链接

  • 方法
  • 事件

作为替代方案,在我升级pg promise软件包之前,所有这些对我都不起作用

这里的答案是:感谢@vitaly-t的响应。这正是我想要的。@retroquere在写这个答案时,并没有连接池这样的东西。目前发布的版本是5.9.5,它仍然使用驱动程序v5.1,它没有任何要共享的外部池,它只有一个全局内部池。只有版本6.x使用最新的驱动程序及其连接池,可以通过@retroquery访问该连接池,在该连接池中,您可以通过;)访问新的池对象@Manoharredyporeddy
pg promise
不做任何文件记录。@Manoharredyporeddy是一个单独的库,不在本问题的范围内。包更新与此有什么关系?没有任何细节,这是一个完全没有价值的补充。