Express js - 数据库连接中的Promise挂起

时间:2017-10-31 15:27:12

标签: javascript sql-server node.js express

在我的登录表单中,我有一个选项,允许我选择要连接的数据库,所以我正在尝试创建一个函数来执行此操作。

在db配置文件中,我有一个名为setDB的函数,它转到另一个名为makeConnection的函数,它将dbname作为参数发送并处理该函数的结果。

问题是第二个函数不返回任何结果,只有promise pending

在这个函数中,我有3个返回,这意味着将在setDB函数中处理的错误,但这不起作用。

var mssql = require('mssql');

module.exports =
{
  setDB: (req, res) =>
  {
    console.log('Prepare to connect to ' + req);
    var result = makeConnection(req);
    console.log(result);

    if(result == 0)
    {
      res.send('Unknown database!');
    }
    else if(result == 1)
    {
      res.send('Error trying to connect!')
    }
    else if(result == 2)
    {
      res.send('Connection done!')
    }
    //return connection;
  }
}

function makeConnection(dbname)
{
  console.log('Start connection....');

  return new Promise(function(resolve, reject) {
    console.log('Database: '+ dbname);
    var configs = {
       Emp1: {
           user: "us",
           password: "pass",
           server: "ip",
           database: "Emp1"
       },
       Emp2: {
           user: "us",
           password: "pass",
           server: "ip",
           database: "Emp2"
       }
     };

     var config = configs[dbname];
     if(config == undefined)
     {
       return 0;
     }

      var connection = new mssql.Connection(config);
      connection.connect(function(err)
      {
        if (err) {
          console.log(err);
          reject(err);
          return 1;
        } else {
          resolve(connection);
          console.log('Database Connected!');
          return 2;
        }
      });
  });
}

控制台打印:

enter image description here

更好的方法是什么? 我想做一个单独的连接,而不是在每个请求中进行连接......例如,它必须准备好由2个用户同时在不同的数据库中使用。

哪种方法更好?

谢谢

1 个答案:

答案 0 :(得分:2)

makeConnection()返回一个Promise。当你打电话时很自然:

var result = makeConnection(req);
console.log(result);

这将导致记录待处理的承诺。那是应该做的。您的函数会立即返回一个待处理的承诺,该承诺将在异步操作返回后解析。但是在尝试记录结果之前,您并没有等待它们。你需要使用promise的then()函数来准备结果:

makeConnection(req)
.then(result => {
   console.log(result);

    if(result == 0)
    {
      res.send('Unknown database!');
    }
    else if(result == 1)
    {
      res.send('Error trying to connect!')
    }
    else if(result == 2)
    {
     res.send('Connection done!')
    }
}