我正在构建一个使用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容器时,应用程序开始给出这个错误。 任何想法可以做什么来解决这个问题。 多谢了。