未正确返回 Restangular 后端调用

Not returning Restangular back-end call correctly

我的后端调用正在返回 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";,当然`看不懂属性'then'的undefined。

对应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?它不应该返回未定义的。

如果您仍然看不到它,那么您的函数中缺少一些 return。

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

provideCredentialsToMFA 应该return 承诺

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

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

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

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

您的代码如下所示。它很相似,但是 $scope.addUser 需要一些 returned 并且不使用回调

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

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

我能看到的唯一可能性是我对 .then() 块的应用是错误的是两个参数(即 response 和 err)的设置让我们只用一个参数尝试。

类似于以下内容:

    $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))。这是我唯一能找到的东西:)