node.js - Nodejs MSSQL如何同时池化多个数据库
问题描述
我正在使用 NodeJS 构建一个庞大的 Intranet,从 ASP.Net C# 转换而来。我一直遇到关于在关闭或必须打开连接时无法使用连接等数据库错误。我正在尝试转换为连接池,但由于我正在连接(当前)6个不同的数据库,因此遇到了问题,并且是 Node MSSQL 的新手,我对如何进行有点不知所措。
最初我调用“runqueries()”传递配置数据,并从那里打开到所需数据库的连接。连接详细信息存储在 database.js 文件中的 JSON 对象中。我现在正在尝试在 database.js 文件中创建池并将其作为要连接的对象返回。
//database.js
const sql = require('mssql');
// const Config = {
// MCAIntranet: {
// user: 'username',
// password: 'password',
// server: 'mcasql',
// database: 'MCAIntranet',
// options: { enableArithAbort: true }
// },
// DEV_Intranet: {
// server: 'mcasql',
// user: 'username',
// password: 'password',
// database: 'DEV_Intranet_Test',
// options: { enableArithAbort: true }
// },
// CMR: {
// user: 'username',
// password: 'password',
// server: 'mcasql',
// database: 'Corporate_Morning_Reports',
// options: { enableArithAbort: true }
// },
// Lansa: {
// user: 'username',
// password: 'password',
// server: 'mcasql',
// database: 'LANSA',
// options: { enableArithAbort: true }
// },
// Roles: {
// user: 'username',
// password: 'password',
// server: 'mcasql',
// database: 'dotNetRolesDB_New',
// options: { enableArithAbort: true }
// },
// PreAuth:{
// user: 'username',
// password: 'password',
// server: 'mcasql',
// database: 'PreAuth',
// options: { enableArithAbort: true }
// }
// }
const CORPIntranet = () => {
new sql.ConnectionPool({
user: 'username',
password: 'password',
server: 'dbserver',
database: 'CORPIntranet',
options: { enableArithAbort: true }
})
.connect().then(pool => pool)
};
const DEV_Intranet = () => {
new sql.ConnectionPool({
user: 'username',
password: 'password',
server: 'dbserver',
database: 'CORPIntranet_Test',
options: { enableArithAbort: true }
})
.connect().then(pool => pool)
};
const CMR = () => {
new sql.ConnectionPool({
user: 'username',
password: 'password',
server: 'dbserver',
database: 'Corporate_Morning_Reports',
options: { enableArithAbort: true }
})
.connect().then(pool => pool)
};
const Lansa = () => {
new sql.ConnectionPool({
user: 'username',
password: 'password',
server: 'dbserver',
database: 'LANSA',
options: { enableArithAbort: true }
})
.connect().then(pool => pool)
};
const Roles = () => {
new sql.ConnectionPool({
user: 'username',
password: 'password',
server: 'dbserver',
database: 'dotNetRolesDB_New',
options: { enableArithAbort: true }
})
.connect().then(pool => pool)
};
const PreAuth = () => {
new sql.ConnectionPool({
user: 'username',
password: 'password',
server: 'dbserver',
database: 'PreAuth',
options: { enableArithAbort: true }
})
.connect().then(pool => pool)
};
const Config = {
CORPIntranet: CORPIntranet(),
DEV_Intranet: DEV_Intranet(),
CMR: CMR(),
Lansa: Lansa(),
Roles: Roles(),
PreAuth: PreAuth()
}
module.exports = Config;
我使用代码调用它await dataQuery.runQuery(query, config.PreAuth);
并且 runquery() 代码是
//dataQueries.js
let sql = require('mssql');
const runQuery = async (query, database) => {
try {
// await sql.connect(database);
// let request = new sql.Request();
let recordset = await database.query(query);
return recordset;
} catch (ex) {
console.log(ex);
{ error: "dataQueries.js 17" + ex.Message };
return "False";
}
finally{
sql.close();
}
}
我知道最后我不需要“sql.close()”,但我正在转换过程中。我现在得到一个 typeError: database.query is not a function。
如果您能指出我的错在哪里,并且最好链接一个假设读者新手状态的好教程,那就太好了。
提前致谢。
编辑 在我的 runQuery() 函数中,我将代码更改为
let pool=await database();
let recordset = await pool.query(query);
现在允许查询运行。但这是正确的方法吗?它会防止多个数据库连接上的错误吗?
解决方案
我以最简单的方式解决了这个问题。我从使用 mssql 模块切换到 sequelize.js,它提供了数据库访问和连接的抽象级别,并简化了对多个数据库以及数据库类型(MSSQL、Postgres、MongoDB 等)的访问
推荐阅读
- javascript - 如何从嵌入式 youtube 播放列表中禁用“相关视频”
- java - 将服务帐户(json 文件)位置传递给 application.properties
- wordpress - 为什么我在创建新页面时看不到我的自定义模板?
- javascript - Firebase 实时数据库不返回任何数据
- mysql - 数据核对
- python - 根据另一个列表从熊猫数据框列中的列表中删除值
- java - 新创建的字符串在哪里?堆内存还是字符串常量池?
- angular - patchValue using the multiplication of two FormControl input in a FormArray
- javascript - How to return a custom response from the class-validator in NestJS
- java - android soft keyboard is not visible when input type set to number for edittext