2014-09-28 79 views
1

我试图从mongodb数据库中取出其_id的对象,并将其放在$scope中供以后使用。但是,当我尝试这样做时,我会获取数据库中的所有对象,而不是我请求的对象。我是新来的平均堆栈,不明白我做错了什么。使用AngularJS消费REST API

如果您有任何进一步的问题,请让我知道。

server.js

var express   = require('express'), 
    app    = module.exports = express(), 
    bodyParser  = require('body-parser'), 
    mongoose   = require('mongoose'), 
    productsController = require('./server/controllers/products-controller'); 

mongoose.connect('mongodb://localhost:27017/mean-demo'); 

app.use(bodyParser()); 

app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/client/views/index.html'); 
}); 

app.get('/product/*', function (req, res) { 
    res.sendfile(__dirname + '/client/views/index.html'); 
}); 

app.use('/js', express.static(__dirname + '/client/js')); 
app.use('/css', express.static(__dirname + '/client/css')); 
app.use('/images', express.static(__dirname + '/client/images')); 
app.use('/views', express.static(__dirname + '/client/views')); 

//REST API 
app.get('/api/products', productsController.products); 
app.get('/api/products/:productId', productsController.product); 

app.listen(3000, function() { 
    console.log('I\'m Listening...'); 
}); 

app.js

var app = angular.module('productApp', ['ngResource', 'ngRoute']); 

app.config(['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) { 
    $routeProvider 
     .when('/', { 
      templateUrl: '/views/productsoverview.html', 
      controller: 'productsController' 
     }) 
     .when('/product/:productId', { 
      templateUrl: '/views/productFocus.html', 
      controller: 'productFocusController' 
     }) 
     .otherwise({ 
      redirectTo: '/' 
     }); 
    $locationProvider.html5Mode(true) 
}]); 

app.controller('productsController', ['$scope', '$resource', 
    function($scope, $resource) { 
     var Product = $resource('/api/products'); 

     $scope.products = []; 

     Product.query(function (results) { 
      $scope.products = results; 
     }); 

}]); 

app.controller('productFocusController', ['$routeParams', '$scope', '$resource', 
    function($routeParams, $scope, $resource) { 
     var Product = $resource('/api/products/:productId',{productId:'@productId'}); 
     Product.productId = $routeParams.productId; 

     console.log(Product.productId); 

     Product.query(function (result) { 
      console.log(result); 
      $scope.product = result; 
     }); 
}]); 

的ProductsController

var Product = require('../models/product'); 

exports.products = function (req, res) { 
    Product.find({}, function (err, results) { 
    res.json(results); 
    }); 
}; 

exports.product = function (req, res) { 
    Product.findOne({_id:req.params.productId}, function (err, obj) { 
    res.json(obj); 
    }); 
}; 
+0

当你注释掉顶部功能,并添加了某种错误处理程序返回的错误类型第二? – Pytth 2014-09-28 18:08:19

+1

如果您需要使用Product.get({productId:123},function(value){do something}),您可以使用'Product.query'来获取所有对象' – snies 2014-09-28 18:30:11

回答

3

您正在使用正g资源有点不对。

尝试编写单个资源,例如

app.resource('Product', ['$resource' 
    function($resource) { 
     return $resource('/api/products/:id', {id: '@id'}, 
     { 
     'update': { method:'PUT' } 
     }); 
    }]); 

现在,你可以注入该资源到你的控制器:

app.controller('productsController', ['$scope', 'Product', 
    function($scope, Product) { 

     $scope.products = []; 

     // this gets ALL products (query) 
     Product.query(function (results) { 
      $scope.products = results; 
     }); 

     // this gets ONE product by id (get) 
     Product.get({id: 123}) 
      .$promise.then(function(product) { 
      $scope.product = product; 
      }); 
    }); 

}]); 

ngResource documentation