节点,蓝鸟承诺,MySQL,并需要一个僵硬的饮料

我正在努力使用MySql实现Bluebird承诺。 我觉得我很接近,但是我的问题开始变得复杂起来,我可以利用一些帮助回到正轨。 我有这个代码所有的callback工作,但我已经承诺与承诺。

目前的问题是,它不喜欢我的查询“那么”,如在:

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访问”文件,看起来像这样:

 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; // }); }); } }; 

我觉得我很接近,但我不能把它放在一起。 任何人都可以帮我理清这个烂摊子吗?

此外,我不知道我正在做一些其他的事情是正确的,我可以返回一个布尔函数,也返回承诺? 如果你看到我已经走了所有的尴尬,请随时将我拉直。 任何帮助表示赞赏。

维克

我也弄不清楚! 最近我得到了像这样的东西:

 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,这只是一个查询生成器,并支持原生的承诺。

当你使用promisifyAllasynchronous函数得到他们promisify与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模块中build立连接是同步的,而不是asynchronous的。 我认为这样做是为了简化,但是现在却让事情变得更加混乱。 所以,当你调用mysql.createPool你不必等待,并可以立即使用返回的poolmysql模块将存储你的查询,并执行它,当连接将真正build立。

 /* 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 promisifyed查询

 pool.queryAsync("DO DB STUFF") .then(function(result){ // dont forget here that result is an array });