我想用AngularJS,Node和MongoDB实现登录方法。我已经在我发送请求时构建了一个Restful API。
当我尝试执行GET请求时,控制台TypeError: UserService.logIn(...).success is not a function
成功不像$http
那样存在?
我也找到了这个,但我无法理解如何调整它以适应我的代码。
HTTP GET" class" actions:Resource.action([parameters],[success], [错误])
非GET" class" actions:Resource.action([parameters],postData, [成功],[错误])
非GET实例操作:实例。$ action([参数],[成功], [错误])
Service.js
var appServices = angular.module('starter.services', ['ngResource']);
appServices.factory('UserService', function ($resource) {
return {
logIn: function (email, password) {
return $resource("http://localhost:3000/users/login", {
email: email,
password: password
});
}
}
});
Controller.js
var apps = angular.module('starter.controller', []);
apps.controller('loginCtrl', function ($scope, $ionicPopup, $state, UserService) {
$scope.doLogin = function doLogin(email, password) {
if (email != null && password != null) {
UserService.logIn(email, password).success(function (data) {
$state.go('tabs.home');
}).error(function (status, data) {
var ionicPop = $ionicPopup.alert({
title: 'Login Failed',
template: 'Invalid email or password.\nPlease try again!'
});
console.log(status);
console.log(data);
});
}
};
});
答案 0 :(得分:5)
您的UserService.logIn()
方法没有按预期运行的原因是,您正在返回Resource
的新实例,但实际上从未在其上调用方法。
// This returns an instance of Resource, which is configured incorrectly.
// The second argument suggests that the URL has :email and :password
// parameters, which it does not. As a result, the email and password
// would be appended to the URL as query params (very insecure!).
return $resource("http://localhost:3000/users/login", {
email: email,
password: password
});
使用$ resource,您可以定义其他方法或修改现有的get
,save
,query
和delete
方法。但是,这仅适用于支持CRUD operations的API端点。
对于登录电话,您不需要创建资源,因为您不会执行CRUD操作。请改用$http
。
var appServices = angular.module('starter.services', ['ngResource']);
appServices.factory('authService', function ($http) {
return {
logIn: function (email, password) {
return $http({
url: 'http://localhost:3000/users/login',
method: 'POST',
data: {
email: email,
password: password
},
headers: {
'Content-Type': 'application/json'
},
withCredentials: true
});
}
}
});
上面的示例假设您要在请求正文中传递用户凭据。假设您正在使用SSL,这是好的,但首选方法是使用Authorization标头。例如,Basic Auth会更安全一些。
<强>更新强>
事实证明,$resource
的方法不会返回Promise
。它们返回一个具有$promise
属性的资源实例。所以,你可以这样做:
// Using the .save() method, which performs a POST
$resource('http://localhost:3000/users/login').save({email: 'foo@bar.com', password: 'baz'})
.$promise.then(handleSuccess, handleError);
不过,我建议使用$http
作为登录端点。但是,如果您需要使用$resource
,请查看this plunker。