【问题标题】:Making a database call inside a node function在节点函数内进行数据库调用
【发布时间】:2014-04-10 20:40:57
【问题描述】:

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

// 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 的函数中设置变量的最佳方法。理想情况下如何做到这一点?

【问题讨论】:

  • 所以我需要将其余的函数内容嵌套在 mysql 调用的成功部分中吗?如果我必须进行 3 或 4 个 mysql 调用,那么它们每个都必须嵌套得越来越深?这看起来很尴尬而且不理想?
  • 是的,欢迎来到异步编程的世界! :-) 如果您对这样的解决方案不满意,请传入函数引用而不是匿名函数,或者查看下面 Bergi 的答案以获取基于 Promises 的解决方案。

标签: javascript node.js asynchronous


【解决方案1】:

Promise 是一种很好的方法。你可以这样使用它们:

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

【讨论】:

  • 那么您是说所有依赖于查询结果的代码都必须嵌套在then 部分中吗?如果我需要进行 3 或 4 个不同的查询来获取值,我需要将它们逐步嵌套在这些 then 调用中?
  • 记录result 的值给出了查询本身和一堆与任何无关的数字,记录is_member 表明它没有定义。我确定我遗漏了一些东西,但这并没有让我得到有意义的结果。
  • promise 的分辨率值作为参数传递给 then 回调 - 抱歉,我使用了标识符 result 两次。
  • 是的,所有依赖于异步结果的代码都需要进入then 回调。但是你不需要嵌套它,你可以unwrap它们 - promises aren't only callbacks
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 2021-02-04
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多