我正在努力用MySql实现Bluebird的承诺。我想我很接近,但我的问题开始变得复杂,我可以使用一些帮助重新走上正轨。我有这个代码都使用回调,但我已经用承诺来支持它。
目前的问题是它不喜欢我的查询中的“then”,如:
conn.query("DO DB STUFF").then(function(result){});
首先,我有一个看起来像这样的connection.js文件。我在代码中添加了一些注释。
(function () {
var mysql = require("mysql");
var pool = mysql.createPool({
connectionLimit: 10,
host: "localhost",
user: "myuser",
password: "password",
database: "dbName"
});
// stole this from http://stackoverflow.com/questions/24797314/how-will-a-promisified-mysql-module-work-with-nodejs
exports.getConnection = function(){
return pool.getConnectionAsync().disposer(function(connection){
try{
connection.release();
} catch (e) {}
});
};
})();
然后我有一个“db access”文件,如下所示:
var Promise = require("bluebird");
Promise.promisifyAll(require("mysql/lib/Connection").prototype);
Promise.promisifyAll(require("mysql/lib/Pool").prototype);
var connection = require("./connection");
var common = require("../../domain/common");
exports.isKnownBadTicker = function (stockSymbol) {
if (stockSymbol == null) { return false; }
else {
var ticker = common.standardizeStockSymbol(stockSymbol);
var query = "SELECT COUNT(*) AS count FROM BadTicker WHERE Symbol = '" + ticker + "';";
// it doesn't like the conn.query(query).then . . . says that "then" is not valid, and so I tried to just return the response of the query - which also doesn't work.
Promise.using(connection.getConnection(), function (conn) {
return conn.query(query)[0]["count"] > 0;
// conn.query(query).then(function (result) {
// return result[0]["count"] > 0;
// });
});
}
};
我觉得我很亲密,但我不能把它放在一起。任何人都可以帮我理清这个烂摊子吗?
另外,我不确定我正在做其他正确的事情,比如,我可以在一个也返回promises的函数中返回一个布尔值吗?如果你发现我已经全力以赴,请随意把我拉直。任何帮助表示赞赏。
维克
答案 0 :(得分:1)
当你使用promisifyAll
异步函数时,他们会使用Async
后缀来宣传兄弟姐妹。因此,您必须使用queryAsync
而不是query
conn.queryAsync("DO DB STUFF")
.then(function(result){
// dont forget here that result is an array
});
在第二个连接示例中的Promisifying是可以的(我的版本甚至有点丑陋)
var Promise = require('bluebird');
var mysql = require('mysql');
Promise.promisifyAll(mysql.Connection.prototype);
Promise.promisifyAll(require('mysql/lib/pool').prototype);
在mysql
模块中获取连接是异步的而不是异步的。我认为这样做是为了简化,但现在它让事情变得更加混乱。因此,当您致电mysql.createPool
时,您不必等待并且可以立即使用返回的pool
- mysql
模块将存储查询并在真正建立连接时执行它。
/* store this pool in a good place - you have to reuse it. */
var pool = mysql.createPool(credentials);
/* you could also create connection like this
var conn = mysql.createConnection(credentials);
, but pull is better when you want to do many queries at a time */
现在,您可以使用pool
这样的
pool.queryAsync("DO DB STUFF")
.then(function(result){
// dont forget here that result is an array
});
答案 1 :(得分:0)
我也想不出来! 我得到的最近的是:
var Promise = require("bluebird");
var mysql = require("mysql");
var pool = mysql.createPool({
connectionLimit: 10,
host: "localhost",
user: "myuser",
password: "password",
database: "dbName" });
pool.query = Promise.promisify(pool.query);
pool.query("DO DB STUFF")
.spread(function(rows,fields){
//access your rows here
});
问题是,字段被附加到rows数组,所以你需要使用.spread。
然而,这整件事让我非常不舒服,因为我不知道如何使用它,所以我查看了knex,它只是一个查询构建器并且原生支持promises。