在链中的nodejs中进行http调用

时间:2015-03-23 15:46:11

标签: node.js express

如何在链中进行http调用api

我的要求是创建帐户

我必须关注事件

1检查帐户是否存在   2如果帐户不存在,则表示我已创建帐户

帐户是否存在  我写了一个功能搜索(帐户名称是唯一的)

 Account.search({"name":"username"})

它使用“用户名”检索帐户名称   如果没有找到我正在调用Account.save()

Account.da.js

exports.search = function (query) {

    var deferred = Q.defer();
    request({
        url: config.ctxDa.url + "/account/search",
        method: "GET",
        qs: query,
        useQuerystring: true,
        headers: {"Content Type": "application/json"}
    }, function (error, response, body) {


        if (!error && response.statusCode == 200) {
            deferred.resolve(body);
        }
        else {
            deferred.reject(error);

        }

    });

    return deferred.promise;

};

//用于创建帐户

  exports.save = function (newAccount) {
        var deferred = Q.defer();


        request({
            url: config.ctxDa.url + "/account",
            method: "POST",
            headers: {"Content Type": "application/json"},
            json: newAccount

        }, function (error, response, body) {

            if (!error && response.statusCode == 200) {
                deferred.resolve(body);
            }
            else {
                deferred.reject(error);

            }

        });

        return deferred.promise;

    };

这是我创建帐户的实用程序功能

exports.createAccount = function (account) {

    var deferred = Q.defer();


    Account.search({name: account.name}).then(function (body) {

        if (JSON.parse(body).length == 0)
            return;

           return throw  new Error("account already exists");

    }).then(function () {

        return Account.save(account).then(function (body) {

            return deferred.resolve(body);
        }, function (error) {

            throw  error;

        })


    }).catch(function (error) {

        deferred.reject(error);

    })
    .done();


return deferred.promise;


}

以链式顺序调用http调用的最佳做法是什么

1 个答案:

答案 0 :(得分:1)

您的逻辑应该有效,尽管您不需要在createAccount函数中创建新的promise对象。因为Account.searchAccount.save都返回了promises,你可以将它们链接起来并返回结果:

exports.createAccount = function(account) {
  return Account.search({name: account.name}).then(function(body) {
    if (JSON.parse(body).length === 0) {
      return;
    }
    // (you don’t need to `return`; `throw` by itself is enough)
    throw new Error('account already exists');
  }).then(function() {
    return Account.save(account);
  });
}

当您使用then()函数链将promises链接在一起时,链的最后一步的返回值将返回给调用者。这就是我们return Account.search(…)的原因。它最终会从then()函数链中返回最终的承诺。如果出现错误,或者Account.save已解决的承诺(这是最终then()函数返回的内容),它将被拒绝承诺。

我们跳过catch函数,因为您只是将任何错误传递给链。如果有错误,它将被传递给createAccount的来电者,他们有责任处理它。

改进此代码的另一种方法是处理JSON.parse函数中的Account.search。它应该返回解析后的结果,而不是返回正文,因此您不必在createAccount函数中(或者您可以调用Account.search的任何其他函数)执行此操作。而且我不确定Account.save返回什么,但看起来也可以在返回之前进行解析。