为什么我的 Q 承诺不起作用?

Why isn't my Q promise working?

我是 promises 和 Q 的新手,我正在尝试转换在 node-mysql 中使用 query 的路由。以下是我的代码摘录:

var Q = require('q');
// connection defined elsewhere

router.get('/', function(req, res) {
    var query = Q.denodeify(connection.query);
    var promise = query("-- query ommitted --", [req.user.id]);
    promise.then(console.log, console.error);
});

我正在尝试从不使用承诺的现有设置中转换它,因此我知道连接设置正确且查询有效。每当我尝试请求这条路线时,我都会在 stderr 中收到相同的消息:

[TypeError: Cannot read property 'connectionConfig' of undefined]

我不知道它来自哪里,所以我不确定如何找到完整的堆栈跟踪。我还尝试了此代码的替代版本,其中我有自己的函数而不是 console.logconsole.error,但是从未调用过此函数并且出现了相同的错误。

更新的答案:

当您 denodeify 查询方法时,您可能失去 connection 的词法范围。

查看 Q documentation 它说这可能是一个问题:

If you are working with methods, instead of simple functions, you can easily run in to the usual problems where passing a method to another function—like Q.nfcall—"un-binds" the method from its owner.

要解决此问题,请尝试使用 Q.nbind

var query = Q.nbind(connection.query, connection);
var promise = query("-- query ommitted --", [req.user.id]);
promise.then(console.log, console.error);

原回答:

查看 node-mysql 源,唯一访问的地方 connectionConfigPool.js 中。所以我的猜测是您对池的配置方式有疑问。