未正确返回 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))
。这是我唯一能找到的东西:)
我的后端调用正在返回 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))
。这是我唯一能找到的东西:)