【问题标题】:Accessing REST server with angularjs $resource. Success callback never triggers使用 angularjs $resource 访问 REST 服务器。成功回调永远不会触发
【发布时间】:2014-03-09 21:17:26
【问题描述】:

我第一次尝试在 Nodejs 上运行 REST 服务器并使用 $resource 从 AngularJS 访问它,但我遇到了问题......

我有一个控制器,它应该在登录时为已知用户加载一个 JSON 对象(购物车),或者如果用户是新用户,则创建一个空对象:

    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}, function(data) {。尽管对象从 Nodejs 服务器发送并在浏览器中接收到状态码 200,但成功回调永远不会被触发。每次我使用正确的用户名运行 login() 函数时,都会触发错误回调,而与 GET 的结果无关。我究竟做错了什么?代码相当简短,但显然我遗漏了一些东西......

提前致谢

【问题讨论】:

    标签: javascript node.js angularjs restify


    【解决方案1】:

    您在通话中发送的是 userId 而不是用户名?

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

    【讨论】:

    • 感谢您的提示,但它并没有解决问题。
    【解决方案2】:

    虽然 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);
    

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 2014-07-20
      • 2015-10-03
      • 2019-10-24
      • 1970-01-01
      相关资源
      最近更新 更多