Javascript 使用Node.js进行全局连接Sql查询

Javascript 使用Node.js进行全局连接Sql查询,javascript,json,sql-server,node.js,Javascript,Json,Sql Server,Node.js,我正在构建一个node.js应用程序,它连接到sql server进行查询!应用程序分为路由器控制器模型和一个名为DatabaseConfig.js的文件,该文件继续数据库的配置参数 在模型中运行查询时,调用以下错误: 全局连接已存在。首先调用sql.close()。 在Object.connect(/Users/myuser/Desktop/myapp/src/ServerJS/ServerJS/node_modules/mssql/lib/base.js:1591:31)* 如何解决此类错误

我正在构建一个node.js应用程序,它连接到sql server进行查询!应用程序分为路由器控制器模型和一个名为DatabaseConfig.js的文件,该文件继续数据库的配置参数

在模型中运行查询时,调用以下错误:

全局连接已存在。首先调用sql.close()。
在Object.connect(/Users/myuser/Desktop/myapp/src/ServerJS/ServerJS/node_modules/mssql/lib/base.js:1591:31)*

如何解决此类错误

型号:

异步函数CaricaRisorseCantiere(IdCantiere){
var数据=[];
const query=“select idrisorsumane,IdUtenteInserimento,u1.Nome+”+u1.Cognome as InseritoDA,ExtraPreventivo,u2.Nome+”+u2.Cognome as Risorsa,risorsumane.idutene,IdCantiere,CONVERT(VARCHAR(10),Data,105)as Data,Descrizione,CONVERT(VARCHAR(5),orenizio,108)as orenizio,CONVERT(VARCHAR(5),OreFine,108)as OreFine,CONVERT(VARCHAR(VARCHAR)(5),OreFine,108)as OreFine),REPLACE(Pausa),:”)作为Pausa,convert(varchar(5),Cast(convert(varchar(5),(OreFine-OreInizio),108)作为datetime)-Cast(替换(Pausa,“,”:”)作为datetime),108)作为u1上的u1的Risorseum内部连接Unte。Idunte=Risorseum.IdunteInSerimento u2上的u2的内部连接Unte。Idunte=Risorseum.Idunte,其中IdCantiere=@IdCantiere按转换顺序(日期时间,数据,103)描述“;
constpool=newsql.ConnectionPool(DbConfigJSON);
pool.connect()。然后(()=>{
const request=新的sql.request(池);
request.input('IdCantiere',sql.Int,IdCantiere);
request.query(查询).then((结果)=>{
对于(var i=0;i{
日志(“Errore:,err”);
});
}
DatabaseConfig.js

exports.config={
用户:“远程”,
密码:“xx”,
服务器:“xx”,
数据库:“xx”,
调试:错误,
港口:1433,
选项:{
加密:false
},
游泳池:{
最高:30,
分:0,,
idleTimeoutMillis:30000
}
};

我将在此处添加一个连接池使用的简单示例:

const DbConfig = require('./DatabaseConfig.json');
const sql = require('mssql');

const query = 'select * from people';
const pool = new sql.ConnectionPool(DbConfig);

pool.connect().then(() => {
    const request = new sql.Request(pool);
    request.query(query).then ((result) => {
        console.log('Query result: ', JSON.stringify(result));

    });
}).catch ((error) => {
   console.error('An error occurred connecting to the db: ', error);  
});
这假设一个名为“people”的表,您可以根据需要重命名它

DatabaseConfig.json文件如下所示:

{
   "user": "some_user",
   "password": "pw",
   "server": "db_Server",
   "database": "test_db",
   "port": 1433
}
下面是另一个示例,从函数返回结果(根据请求):


您是否可能同时运行两个查询?我是说在短时间内执行两个函数调用?是的,这是可能的,但我不知道如何停止它!我们可以使用poolsYes,我建议您尝试在mssql中使用连接池机制,这应该允许您保持多个连接处于打开状态。@Terrylenox事实上,我没有了解如何正确实现我试图实现您的解决方案,但它给了我以下错误:UnhandledPromisejection警告:UnhandledPromisejectionWarning:Unhandled promise rejection。此错误源于在没有catch块的情况下抛出anasync函数内部,或拒绝未使用.catch()处理的承诺。(拒绝id:2)(节点:3197)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。好的,连接到db时一定有错误。让我用.catch块更新以显示错误!确保在DatabaseConfig文件m中使用的配置ATCH数据库服务器,例如用户名、密码等!json配置文件中的参数错误!但是我有另一个问题(我更新了当前版本以上的代码)如何等到for循环结束后生成数据(数组)return?要获取要返回的数据数组,您需要利用承诺链这一事实。您需要执行return pool.connect()。然后(…和return request。然后(…这将导致CaricarisorsCantiere返回承诺。
const DbConfig = require('./DatabaseConfig.json');
const sql = require('mssql');

const query = 'select * from people';
const pool = new sql.ConnectionPool(DbConfig);

async function testQuery() {
    await pool.connect();
    const request = new sql.Request(pool);
    const result = await request.query(query);
    return result;
};

testQuery().then ((result) => {
    console.log('Result: ', JSON.stringify(result));
});