【问题标题】:Use promise to wait for database operation使用 promise 等待数据库操作
【发布时间】:2016-05-03 17:04:35
【问题描述】:

我有一个函数调用另一个函数,该函数连接到数据库以获取一些值。在执行完成之前,我无法继续进行,因为该值将用于数据库上的另一个事务。

我使用yield 来确定该方法的完成,并使用promise 来解决或拒绝响应。我就是这样做的:

co(function*() {
  rec.x = yield getX(a, b);
  //use rec to update something else
  conn.update(rec);
}).catch((err) => {
  console.error(err.stack)
});

function getX(a, b) {
  return conn.getVal(a, b);
}

exports.getVal = function(a, b) {
  return sql.connect(connStr).then(function() {
    return new sql.Request()
      .input('a', sql.VarChar(100), a)
      .input('b', sql.VarChar(50), b)
      .execute('someProc').then(function(recordSet) {
        return Promise.resolve(recordSet[0][0]);
      });
  });
};

我收到此错误:

ConnectionError: Connection is closed.
    at node_modules/mssql/lib/main.js:1613:17
    at doNTCallback0 (node.js:417:9)
    at process._tickCallback (node.js:346:13)

编辑

连接字符串:

Uname:pass@server/database

【问题讨论】:

  • 在 node_modules/mssql/lib/main.js: 1613 :17 你发布的代码中哪一行是第 1613 行
  • 请求是否可以在不通过生成器/yield 的情况下工作?意思是,如果你直接调用getVal函数,它会起作用吗?
  • 你能在帖子中分享你的连接字符串吗?
  • @Freyday 是的。该请求在没有产量的情况下可以正常工作..
  • 如果您将sql.connect(conStr) 分配给connection 变量,然后将connectionsql.Request(connection) 一样传递给sql.Request(),会发生什么?你也遇到同样的错误吗?

标签: javascript node.js promise generator co


【解决方案1】:

花了几个小时弄清楚mssql 的这个巫术。似乎mssql 不能很好地处理并发connection。因此,在发出连接请求时使用setTimeout 为我解决了这个问题。

如果它对任何人有帮助,这就是我所做的:

exports.getVal = function(obj, cb) {
    var connection = new sql.Connection(config, function(err){
        if (err){
            console.log(err);
        }
        console.log('connected..');
        var request = new sql.Request(connection);
        request.input('a', sql.VarChar(100), obj.a);
        request.input('b', sql.VarChar(50), obj.b);
        request.execute('proc', function (err, recordSet, returnValue, affected) {
            if (err) {
                console.log(err);
            }
            cb(recordSet[0][0]);
        });
    });
};

我是这样称呼的:

 setTimeout(function(){
                                getVal(rec, function(obj){
                                    console.log(obj);
                                });
                            }, 500);

【讨论】:

    猜你喜欢
    • 2021-04-01
    • 1970-01-01
    • 2017-07-20
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 2020-01-15
    相关资源
    最近更新 更多