没有正确返回Restangular后端调用

时间:2015-08-11 00:57:29

标签: angularjs restangular

我的后端通话正在返回undefined。 A.k.a TypeError: Cannot read property 'then' of undefined。我想我的调用不正确。

以下是AngularJS控制器代码:

$scope.addUser = function (chaseUser) {
    Accounts.addChaseUser(userToSubmit).then(function (response, err) {
        if (err) {
            $scope.errorMessage = "There was an error.";
            $log.debug(err);
        } else if (response) {
            $scope.errorMessage = "It worked.";
            $log.debug(response);
        } else {
            $scope.errorMessage = "No 'response' nor 'err' returned from backend";
        }
    });
};

这是如何响应的,如果......

(1) 我输入了正确的凭据,我收到了response,其中包含所有交易数据,但仍然是TypeError: Cannot read property 'then' of undefined控制台。

(2) 输入错误的凭据,我没有得到任何错误对象,响应对象,甚至将其缩小到我所拥有的行$scope.errorMessage = "No 'response' nor 'err' returned from backend"; ,当然,'无法读取属性'然后'未定义。

对应的AngularJS服务:

return {
    addChaseUser: function(credentials) {
        return Restangular.one('user').customPOST(credentials, 'addUser');
    }
};

在后端(控制器):

module.exports = {

   addChaseUser: function (req, res) {
      PlaidService.provideCredentialsToMFA(req.body, function (err, mfaRes) {
        if (err) {
          return res.status(403).json(err);
        }
        return res.json(mfaRes);
      });
    },

 };

后端服务:

var plaid = require('plaid');
var plaidClient = new plaid.Client('test_id', 'test_secret', plaid.environments.tartan); 

module.exports = {
  provideCredentialsToMFA: function (credentials, cb) {
    Q.fcall(PlaidService.connectUser.bind(this, credentials))
      .then(PlaidService.saveUsersAccessToken.bind(this, credentials))
      .then(PlaidService.getTransactionData.bind(this, credentials))
      .then(function(transactions) {
        cb(null, transactions);
      },
      function(err) {
        console.log(err);
        cb(err, null);
      });
  },

}

我应该如何从AngularJS控制器调用此Restangular POST?它不应该返回undefined。

2 个答案:

答案 0 :(得分:3)

由于您从服务器端获得响应,这意味着您的服务器端代码和角度服务代码正常工作。 :)

我能看到的唯一可能性是我错误的.then()块的应用是两个参数的内容(即响应和错误)让我们只尝试一个参数。

如下所示:

    $scope.addUser = function (chaseUser) {
        Accounts.addChaseUser(userToSubmit).then(function (response) {
            if(response.status == 'error'){
               $log.debug('Got error in the response');
            }else{
               $log.debug('SUCCESS');
            }
        });
    };

我使用.then(function(data))只有一个参数。这是我唯一能找到的东西:)

答案 1 :(得分:1)

如果你仍然没有看到它,你的功能中缺少一些回报。

addUser: function (req, res) {
   return PlaidService.provideCredentialsToMFA(
       // ... your code ...
      );
},

provideCredentialsToMFA应该返回承诺

provideCredentialsToMFA: function (credentials, cb) {
  return plaidClient.addConnectUser(
       // ... Your code ...
      );
}

编辑: 简化工作代码看起来像这样。请注意,没有返回,只使用回调:

  findChargeById: function (req, res) {
    fetchCharge(someParams, someCallBack);
  }

  fetchCharge: function (chargeId, cb) {
    stripe.charges.retrieve(chargeId, anotherCallBack);
  }

您的代码如下所示。它很相似,但$scope.addUser期望返回的内容并没有使用回调

   addUser: function (req, res) {
      provideCredentialsToMFA(someParams, someCallBack);
      // addUser returns nothing
   }

   provideCredentialsToMFA: function (credentials, cb) {
     plaidClient.addConnectUser(someParams, someCallBack);
     // provideCredentialsToMFA returns nothing and it seems plaidClient.addConnectUser returns nothing too
   }


$scope.addUser = function (userInfo) {
    // Here is the difference with your 'then' call. Accounts.addUser doesn't return anything and takes 2 params
    Accounts.addUser(userInfo).then(someCallBack);
};