首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用q与Node-Mysql

使用q与Node-Mysql
EN

Stack Overflow用户
提问于 2014-01-22 18:45:20
回答 1查看 4.3K关注 0票数 3

我是Node的新手,但我在移植RESTful API方面取得了很好的成功,这是以前用PHP实现的。有相当多的数据库交互,因此我发现自己进入了我相信很多人称之为“末日金字塔”,因为节点的异步性质。

因此,我正在尝试使用Q库实现承诺,但我还没有取得多大的成功,而且当我认为我应该得到数据时,仍然会得到空的结果集。下面是我在添加Q之前的当前结构,如果有人可以建议如何正确地实现Q,我将能够使用该示例运行,并将数据库/memcached调用的其余部分转换为该模型。

代码语言:javascript
复制
// helper function to get a company row
getRow = function(lookUp, callback) {
    var query = db.query('SELECT * FROM table WHERE lookUp = ?', lookUp, function(err, result) {
        var count = Object.keys(result).length;

        if(count == 0) {
            return;
        } else {
            callback(null, result);
        }
    });
}

// function that uses the above helper method
insertItem = function(request, response) {
    var data = JSON.parse(request.body.data);
    var message = data.message;
    var lookUp = data.lookUp;

    security.verifyToken(lookUp, function (lookUpError) {
        if (lookUpError) {
            var errorResult = { "response": "error", "msg": lookUpError };
            response.json(errorResult);
            response.end();
        } else {
            getRow(lookUp, function (companyError, row) {
                var companyId = row[0].id;

                var res = helper.insertFeedItem(companyId, message, function (insertError, insertResult) {
                    var result = (feedError) ? { "response": "error", "msg": insertError} : insertResult;
                    response.json(result);
                    response.end();
                });
            });
        }
    });
}

我想要完成的是能够做这样的事情:

代码语言:javascript
复制
var result = getCompanyRow(lookUp);
companyId = result.company_id;

同样,对于如何在这种情况下最好地实现Q(或者只是承诺)的任何见解都将是非常感谢的。

*编辑:

以下是我到目前为止为实现Q所做的尝试,但正如我所说的,我没有得到任何回报。

代码语言:javascript
复制
function getRow(id) {
  var dfd = Q.defer();
  var query = db.query('SELECT * FROM table WHERE lookUp = ?', id, function(err, result) {
    if(err) { dfd.reject(err); }
    else { dfd.resolve(result); }
  });
  return dfd.promise;
}

当调用为result =getRow(Id)时,上面的内容根本不起作用;我尝试使用Q.all并将函数绑定到它,但在尝试这种方法时,我也没有得到任何回报。我不知道在我对.then()的调用中包含了什么,但是我尝试了许多事情,但没有一个成功。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 20:53:05

您的getRow允诺函数看起来很有前途:-)它可以通过使用Q进一步简化

代码语言:javascript
复制
function getRow(id) {
    return Q.nfcall(db.query,    'SELECT * FROM table WHERE lookUp = ?', id);
    //      ^^^^^^^^^^^^^^^^^^^^
    // or   .ninvoke(db, "query", … if it must be called as a method
}
// or even just
var getRow = Q.nbind(db.query, db, 'SELECT * FROM table WHERE lookUp = ?');

我认为使用.then(函数.)没有任何好处。因为它仍然需要嵌套,就像回调一样。

好处(除了更简单的错误处理)来自于链接多个任务,即当您的security.verifyTokenhelper.insertFeedItem方法也将返回承诺时。如果它们不使用(而且您也不能修改它们),那么仍然可以使用Q.nfcall,如上面的示例所示。假设是这样的话,您的代码可以简化为

代码语言:javascript
复制
function insertItem(request, response) {
    var data = JSON.parse(request.body.data);

    security.verifyToken(data.lookUp).then(function(/* no lookupError */) {
        return getRow(data.lookUp); // potentially catch SQL errors here
    }).then(function(row) {
        return helper.insertFeedItem(row[0].id, data.message);
        // What was the `res` it had returned before?
    }).catch(function(someError) { // lookUpError, companyError, insertError
        return { "response": "error", "msg": someError };
    }).done(function(result) {
        response.json(result);
        response.end();
    });
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21291305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档