首页 > 解决方案 > 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);

现在允许查询运行。但这是正确的方法吗?它会防止多个数据库连接上的错误吗?

标签: node.jssql-serverexpress

解决方案


我以最简单的方式解决了这个问题。我从使用 mssql 模块切换到 sequelize.js,它提供了数据库访问和连接的抽象级别,并简化了对多个数据库以及数据库类型(MSSQL、Postgres、MongoDB 等)的访问


推荐阅读