当前位置: 首页 > 面试题库 >

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

锺离卓
2023-03-14
问题内容

我正在构建一个使用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}`);
});

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

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

const db = pgp(databaseConfig).catch((err) => { // blow up });

但这没有用,因为pgp没有兑现承诺。


问题答案:

我是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: getaddrinfo ENOTFOUND 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链接:

  • 方法功能
  • 方法连接
  • 事件错误


 类似资料:
  • 我在SpringBoot中安装了开发人员应用程序,导出了war文件并将其放在Tomcat9服务器中。当我尝试在Rest客户端中测试API时,应用程序正在连接到测试DB,而不是我在应用程序中声明的DB。mongodb的属性,下面是我的应用程序。所有物 有人能帮我吗。

  • 问题内容: 我正在研究将由学校使用的应用程序。每所学校将建立自己的数据库。每个学校都会为应用程序提供自己的“设置”文件。设置文件将包含创建设置文件的特定学校的数据库URL。这样一来,使用该应用程序的学生如果想连接到其他数据库,就只能加载其他设置文件。 我的问题是,如何保护用于连接数据库的用户名和密码?因此,只有应用程序具有对数据库的读写访问权限。应用程序仅具有该特定学校的读写权限吗? 如果您需要更

  • 我想用“OpenOrCreateDatabase”创建一个SQLLite数据库。问题是,我在创建一个新表时出现了一个错误。 这是我的代码: 怎么了? 多谢!

  • 我正在用spring boot开发一个应用程序。我使用Mysql数据库来实现持久性。我的数据库在远程服务器上。如何为远程数据库连接配置数据源? 请帮助我在属性文件和数据源bean配置中使用我的配置类中的注释来配置它。

  • Spring Boot版本为1.5.6 使用的数据库是SQL Server2016,它也是在docker(windows容器)上。 问题:每当我重新启动SQL DB容器时,应用程序开始给出这个错误。 任何想法可以做什么来解决这个问题。 多谢了。