Nodejs(Generic Pool):捕获错误时释放资源

Nodejs (Generic Pool): release the resource when catching an error

根据node-pool,获取资源的过程是这样的:

 const resourcePromise = myPool.acquire();
  resourcePromise
  .then(function(client) {
    client.query("select * from foo", [], function() {
      // return object back to pool
      myPool.release(client);
    });
  })
  .catch(function(err) {
    // handle error 
  });

假设我有这样一个场景,在处理数据时(获取资源后,释放前)发生异常

就像下面的例子:

const resourcePromise = myPool.acquire();
resourcePromise
  .then(function(client) {
    client.query("select * from foo", [], function() {
      throw new Error('unknown error');
      myPool.release(client);
    });
  })
  .catch(function(err) {
    // how can I release the resource here?
  });

那我怎么释放资源呢?

几种方式。全局获取客户端挂钩:

let client;
resourcePromise
  .then(c=> {
      client = c;
      return query.whatever();
   })
  .catch(() => {
    resource.release(client);
  });

或者像 Bluebird 的 finally 这样的东西可以帮助:

let client;
resourcePromise
  .then(c=> {
      client = c;
   })
  .catch(/* whatever else */)
  .finally(() => {
    resource.release(client);
  })

不过,您还必须确保处理超时 - 万一 promise 永远无法解决(成功与否),您永远不会进入任何处理程序。

另一种方法是处理promise链中的错误:

resourcePromise.then(function (client) {
  return query.whatever(client)
    .catch(() => resource.release(client));
});