在节点函数内进行数据库调用

时间:2014-04-10 20:40:57

标签: javascript node.js asynchronous

我有一个我正在调用的函数,我需要在该函数内部进行一些数据库查询。在节点中执行此操作的最佳方法是什么?目前我只是发出请求并将返回值赋给变量,但这会导致变量未被设置。例如:

// bunch of code
var is_member = false;
mysql.query('SELECT EXISTS ( SELECT * FROM `qazusers` WHERE `qazemail` = ? OR `otheremail` = ? LIMIT 1)', [emailaddress, emailaddress], function (err, result) {
    if (err) {
        logger.info('Error checking. ', err);
    }
    logger.info('checkmembership: ', result);
    if (result[0] === 1) {
        is_member = true;
    }
// bunch more code finishing out the function this is inside

包含函数运行完毕后,is_member始终为false。我假设这是由于节点的异步性质,但是,处理这个问题的最佳方法是什么?我已经在Promises上读过一些内容(比如Q库),但我仍然不确定处理基于nodejs的函数内部变量的最佳方法。理想情况下,如何做到这一点?

1 个答案:

答案 0 :(得分:2)

承诺是一种很好的方法。你会像这样使用它们:

var promise = Q.ninvoke(mysql, "query", 'SELECT EXISTS ( SELECT * FROM `qazusers` WHERE `qazemail` = ? OR `otheremail` = ? LIMIT 1)', [emailaddress, emailaddress])
var moreresults = promise.then(function(result) {
    logger.info('checkmembership: ', result);
    return result[0] === 1;
}).then(function(is_member) {
    // bunch more code finishing out
    return more;
});
moreresults.catch(function(err) {
    logger.info('Error checking. ', err);
});