Node Express 多个 SQL Server 连接

3
我需要连接到不同服务器上的不同数据库。这些服务器都是Microsoft SQL Server。
我是这样做的:

dbconfig.js

    var sql1 = require('mssql')
    var sql2 = require('mssql')

    var conn1 = {server:"SERVER IP", database:"db1", user:"foo", password:"foo", port:1433}

    var conn2= {server:"SERVER2 IP", database:"db2", user:"foo2", password:"foo2", port:1433}

var server1= sql1.connect(conn1)
    .then(function() {  debug('Connected'); })
    .catch(function(err) { debug('Error connect SQL Server', err);  });

    var server2= sql2.connect(conn2)
        .then(function() {  debug('Connected'); })
        .catch(function(err) { debug('Error connect SQL Server', err);  });

module.exports = {"ServerConn1": sql1, "ServerConn2": sql2};

之后,两个连接都是活动的,但当我对第一个连接进行查询时,它无法工作。

错误是“无效的对象名称'FooDatabase.dbo.fooTable'。”

有人能帮我解决这个问题吗?

谢谢!

3个回答

1
我使用MySQL实现,你可以通过传递空的数据库参数并在创建连接之前更新数据库来执行相同的操作。不需要导入两次,只需在创建连接或查询之前更新数据库名称即可。
const express = 

require('express');  
const app = express();  
const port = process.env.PORT || 80;
var http = require('http');
var mysql = require('mysql')
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : '',//here i am not passing db and db is undefined

});

app.get('/db1',function(req,res)
{
connection.config.database="task" //here  i updating db name before query
connection.query('SELECT * FROM tasks', function (error, results, fields) {
    console.log(results)
    res.json(fields)
connection.end()
})
})

app.get('/db2',function(req,res)
{
connection.config.database="cg_taskview" //db2

connection.query('SELECT * FROM tasks', function (error, results, fields) {
     if (error)
    console.log(error); 
    console.log(results)
    res.json(fields)
     });
connection.end()

})

var server = http.createServer(app);
server.listen(port, function () { 
})

1
你正在同一台服务器上进行查询!我需要同时在不同的服务器上进行查询。我需要保持连接开放! - Sergi Nadal
关闭连接使用end()方法完成,该方法确保在向mysql服务器发送退出数据包之前执行所有剩余的查询。https://www.npmjs.com/package/mysql - Adiii

0

当第二个MSSQL服务器被添加为项目的数据源时,我开始遇到类似的问题...幸运的是,在tediousjs的示例中找到了解决方案。只需使用ConnectionPool,并不要忘记关闭连接:

const settings  = require('./config');
const sql = require('mssql');

exports.someSqlQuery = async function(sqlQuery) {
  const cPool = new sql.ConnectionPool(config);
  cPool.on('error', err => console.log('---> SQL Error: ', err));

  try {
    await cPool.connect();
    let result = await cPool.request().query(sqlQuery);
    return {data: result};
  } catch (err) { 
    return {error: err};
  } finally {
    cPool.close(); // <-- closing connection in the end it's a key
  }
};

如果您的所有连接都将被关闭,您可以使用不同服务器上的不同数据库的连接。

0
以下是我的测试代码:
var sql = require('mssql/msnodesqlv8');

const config = {server:'localhost', database:'TestDB', 
        options: { trustedConnection: true }};
const config2 = {server:'SomewhereNotExist', database:'TestDB', 
        options: { trustedConnection: true }};

(async () => {
  try { 
    let pool = await sql.connect(config);
    let result = await pool.request().query('select count(1) as cnt from AlarmWithLastStatus');
    console.log('DB1 result:');
    console.dir(result.recordset);

    let pool2 = await sql.connect(config2);
    let result2 = await pool2.request().query('select count(1) as cnt from AlarmWithLastStatus');
    console.log('DB2 result:');
    console.dir(result2.recordset);
  } catch (err) {
    if (err) console.log(err);
  }
}) ();

输出结果: DB1 结果:[{cnt: 12}] DB2 结果:[{cnt: 12}]
你可以看到这两个连接实际上指向同一个服务器。 如果你将第二个查询更改为在此服务器中不存在的表,那么就会生成你得到的错误。

1
欢迎来到SO!这只是一个评论,而不是回答。请编辑它以成为回复,或者等待赢得一些声望来发表评论。有些人可能会对您的回复进行投票降低分数。 - David García Bodego
当我尝试上述代码时,我能够成功连接到第一个服务器,没有任何问题。但是当我尝试连接到第二个服务器时,我会收到“全局连接已存在”的错误提示。请告诉我是否需要更改一些内容以便从Node.js连接到多个SQL服务器。 - vikasse

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接