Javascript 使用angularjs$资源访问REST服务器。成功回调从不触发
我第一次尝试在Nodejs上运行REST服务器,并使用$resource从AngularJS访问它,但我遇到了一些问题 我有一个控制器,它应该在登录时为已知用户加载JSON对象购物车,或者如果用户是新用户,则创建空对象:Javascript 使用angularjs$资源访问REST服务器。成功回调从不触发,javascript,node.js,angularjs,restify,Javascript,Node.js,Angularjs,Restify,我第一次尝试在Nodejs上运行REST服务器,并使用$resource从AngularJS访问它,但我遇到了一些问题 我有一个控制器,它应该在登录时为已知用户加载JSON对象购物车,或者如果用户是新用户,则创建空对象: myApp.controller('MainCtrl', ['$scope', '$resource', function($scope, $resource) { $scope.loggedIn = false; var DataService = $resour
myApp.controller('MainCtrl', ['$scope', '$resource', function($scope, $resource) {
$scope.loggedIn = false;
var DataService = $resource('http://localhost:8080/cart/:userId');
$scope.login = function(user) {
DataService.query({userId: user}, function(data) {
// success
$scope.items = data;
$scope.loggedIn = true;
}, function() {
// error
$scope.items = [
{text: '', price: 0, quantity: 0}
];
$scope.loggedIn = true;
});
$scope.username = user;
};
}]);
服务器很简单,使用restify:
var restify = require("restify");
var authenticatedUsers = [
{username:'shopper', korb:[
{text:'Many small thigns', price:1.50, quantity:27},
{text:'Nexus 5 red', price:399.0, quantity:1},
{text:'Something special', price:150.0, quantity:2}
]}
];
function respond(req, res, next) {
var name = req.params.name;
var cart;
authenticatedUsers.forEach(function(user) {
if (user.username == name) {
cart = user.korb;
}
})
res.send(cart);
}
var server = restify.createServer();
server.get('/cart/:name', respond);
server.head('/cart/:name', respond);
server.listen(8080, function() {
console.log('%s listening at %s', server.name, server.url);
})
问题在于DataService.query{userId:user},functiondata{。虽然对象从Nodejs服务器发送,并在浏览器中接收,状态代码为200,但成功回调从未触发。每次我使用正确的用户名运行登录函数时,错误回调都会被触发,而与get的结果无关。我做错了什么?代码相当简短,但显然很简单我错过了一些东西
提前感谢您在通话中发送的是用户ID而不是用户名
DataService.query({userId: user}, function(data) {
// success
$scope.items = data;
$scope.loggedIn = true;
}...
这应该是:
DataService.query({username: user}, function(data) {
// success
$scope.items = data;
$scope.loggedIn = true;
}...
虽然Firefox在从REST服务器获取数据时没有产生任何错误,但Chrome却产生了错误。这帮助我发现我的服务器需要用户cors跨源资源共享。在将cors包含到nodejs中之后,现在一切都正常了 如果有人感兴趣,这里是新服务器。使用Express而不是Restify
var express = require('express'), cors = require('cors');
var app = express();
app.use(express.bodyParser());
app.use(cors());
app.use(app.router);
var users = [
{name:'shopper', cart:[
{text:'Many small thigns', price:1.50, quantity:27},
{text:'Nexus 5 red', price:399.0, quantity:1},
{text:'Something special', price:150.0, quantity:2}
]
}];
app.get('/cart/:id', function(req, res) {
var id = req.params.id;
console.log('id = ' + id)
var cart = [];
users.forEach(function(user) {
if(user.name === id) {
console.log('found the user');
return res.json(user.cart);
}
});
res.statusCode = 404;
return res.send('Error 404: User not found');
});
app.post('/cart', function(req, res) {
console.log('POST');
if(!req.body.hasOwnProperty('name') ||
!req.body.hasOwnProperty('cart')) {
res.statusCode = 400;
return res.send('Error 400: Post syntax incorrect.');
}
var newCart = {
name: req.body.name,
cart: req.body.cart
};
users.push(newCart);
console.log(newCart);
res.json(true);
});
app.listen(process.env.PORT || 3000);
谢谢你的提示,但这并没有解决问题。