2017-09-13 47 views
0

场景: 使用mssql我连接到sql并检索id列表,然后根据那些id我想运行存储过程。我目前正在做的是运行第一个存储过程,将ID存储在一个数组中,然后运行一个for循环调用另一个模块,在那里传递id来运行存储过程。这可以正常工作,当我有一个单一的ID,但失败'全局连接已经存在。首先调用sql.close()。'当我尝试运行多个。如何在节点j中的循环中查询SQL

如何创建连接到SQL,运行我的查询,然后运行下一个?什么是最好的方法?

下面的代码运行带有ID的存储过程并导致上述错误。

exports.runStoredProc = function (query,id) { 
    sql.connect(config.config).then(()=>{ 
     return sql.query`${query} ${id}` 
     }).then(res=> { 
     do something with the response  
     }).catch(error => { 
     console.log(error) 
    }) 
} 

看起来像下面一段代码使用下一个ID运行它时仍然存在连接。我认为创建Promise会在它再次运行上面的代码之前强制等待执行?

let toRun = result.recordset.length 
let gen = async num => { 
    for(let i=0;i<num;i++) { 
    var resp = result.recordset[i].id 
    console.log(i, resp) 
    var sp = report 
    var reportId = await new Promise(() => db.runStoredProc(sp,resp)) 
    }   
} 
gen(toRun).then(() => console.log("done!")) 
+0

'=等待新的承诺(()=> db.runStoredProc(SP ,resp))'不起作用。我不确定你的想法。 –

回答

0

你需要从runStoredProc

exports.runStoredProc = function (query,id) { 
    return sql.connect(config.config).then(()=>{ 
     return sql.query`${query} ${id}` 
     }).then(res=> { 
     do something with the response  
     }).catch(error => { 
     console.log(error) 
    }) 
} 

,无需返回Promise环路包裹db.runStoredProc

let toRun = result.recordset.length 
let gen = async num => { 
    for(let i=0;i<num;i++) { 
    var resp = result.recordset[i].id 
    console.log(i, resp) 
    var sp = report 
    var reportId = await db.runStoredProc(sp,resp) 
    }   
} 
gen(toRun).then(() => console.log("done!"))