Node.js Express mssql - 如何通过promise链路传回从DB获取的数据

时间:2017-09-11 14:43:05

标签: sql-server node.js promise

我是MEAN环境的新手,而不是使用promises的专家。我很困惑如何使用promise实现此行为。 我的路由器方法调用服务方法,该方法具有链接到qyery DB的promise并返回结果。我想将这些结果发送回路由器,以便我可以发送到前端。那就是问题所在,我得到了不确定。 Router.js:

myrouter('/api/getDatafromDB',(req,res){
results =getSQLResults();
res.send(results); //want to achieve that.

}

SQLServiceFile.js :

//Db connection code defined in separate js file - dbConfig.js and 
//imported in connection object

getSQLResults=function(){
connection.connect().then(    //promise1
function(recordset){
request.query('select * from xyz')  //promise 2
.then(
//recordset fetched fine here and want to pass to router.

rec= recordset['recordset']; //basically want to pass back rec.
console.log(rec);
connection.close();
).catch(function(err){
//error handling}
connection.close();)
}


).catch(//error handling code);

}

我尝试了不同的变化,但没有奏效。现在,我认为我读到的某个地方,我需要在承诺或类似的东西中再次传回回调。我不知道。但我想如果我改变我的代码使用回调而不是承诺,它会起作用或者如果我在路由器中放回sql查询代码。 我想保持代码结构如此,所以请建议正确的方法。

1 个答案:

答案 0 :(得分:1)

您的代码在语法上是错误的。也许下面的代码可以帮助你,这是使用promises和异步编程的正确方法。下面使用的模式称为.then chaining。我们可以链接多个.then以在js中实现同步模式。

.then.catch仅接受函数作为参数。

myrouter('/api/getDatafromDB', (req,res) => {
  getSQLResults()
  .then( result => res.send(results) )
  .catch( err => ErrorHandler(err) )
}

SQLServiceFile.js :

//Db connection code defined in separate js file - dbConfig.js and 
//imported in connection object

function getSQLResults() {
  return connection.connect()
  .then( function() { 
    return request.query('select * from xyz') 
  })
  .then( function(recordset) {
    connection.close();
    return recordset['recordset'];
  })
  .catch( function(err) {
    connection.close();
    throw err; // it can be done so that you can handle the errors in myRouter
  });
}