我的后端通话正在返回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。
答案 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);
};