作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力用 MySql 实现 Bluebird promise 。我想我已经很接近了,但我的问题开始变得复杂,我需要一些帮助才能回到正轨。我让这段代码都与回调一起工作,但我已经用 promises 把它搞定了。
当前的问题是它不喜欢我的查询中的“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) {}
});
};
})();
然后我有一个“数据库访问”文件,如下所示:
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;
// });
});
}
};
我觉得我很接近,但我就是不能完全把它放在一起。谁能帮我解决这个问题?
此外,我不确定我做的其他一些事情是否正确,例如,我可以在函数中返回一个 bool 值,该函数也返回 promises 吗?如果你看到我变得很古怪,请随时纠正我。感谢您的帮助。
维克
最佳答案
当您使用 promisifyAll
异步函数时,它们会得到带有 Async
后缀的 promisify 兄弟。所以你必须使用 queryAsync
而不是 query
conn.queryAsync("DO DB STUFF")
.then(function(result){
// dont forget here that result is an array
});
第二个连接示例中的 Promisify 是可以的(我的版本甚至有点难看)
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 */
现在您可以像这样使用您的池
进行 promise 查询
pool.queryAsync("DO DB STUFF")
.then(function(result){
// dont forget here that result is an array
});
关于javascript - Node、Bluebird Promises、MySQL 以及喝一杯烈性酒的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31643667/
我是一名优秀的程序员,十分优秀!