Angular-Full Stack:使用带参数的 $resource 查询

Angular-Fullstack: Using $resourse query with params

我正在使用 Angular-Fullstack 生成器,但我无法通过 $resource 查询获得取决于公司 ID 的驱动程序列表。这是我的:

server/api/driver/index.js:

router.get('/:company', controller.index);

server/api/driver/driver.controller.js:

export function index(req, res) {
  return Driver.find({company: req.params.company}).exec()
    .then(function(res){
       console.log(res); /* I get here the result correctly */
       respondWithResult(res)
    })
    .catch(handleError(res));
}

client/services/driver.service.js:

export function DriverResource($resource) {
  'ngInject';

  return $resource('/api/drivers/:id/:company', {company: '@_id'});
}

client/app/driver/driver.controller.js:

this.driverList = Driver.query({company: Auth.getCurrentUser()._id}});
console.log(this.driverList); /* Empty array */

如果有人能帮助我从服务器获得响应,我将不胜感激...

提前致谢。

你很接近。

Driver.query({company: 'foo'}).$promise.then(function(results) {
  console.log(results) //here
}, function(err) {
  //here is your 404 error, but you should create an http interceptor
});

它是异步的,你不会马上得到你的结果。 这当然会起作用,前提是您的后端响应正确。

编辑:您的后端缺少一些端点。您应该能够使用 drivers

的列表来响应对 /api/drivers/ 的请求

编辑 2:

Angular 的资源将使您能够访问一些方法:

Driver.get(1) 将向 /api/drivers/:id 发出请求,并期望后端以 object 表示具有所述 ID 的 driver。当您只想获取 1 条记录时应该使用此方法

Driver.query({foo: 'bar', some_id: 1}) 会向 /api/drivers 发出请求吗? foo=bar&some_id=1 并期望后端以 object 数组响应,每个数组代表一个 driver。当你想获取多条记录时应该使用它,例如在索引中。

Driver.query() 将向 /api/drivers 发出请求并期望后端以数组

响应

Driver.create(data) 将向 /api/drivers 发出 POST 请求,并期望 object(创建的driver) 在响应中。用于创建新记录

还有一些,我用的就是这个

因此,考虑到您正在使用这三种方法,您的后端需要处理:

router.get('/drivers/:id', function(req, res) {
  let id = req.params.id
})

router.get('/drivers', function(req, res) {
  //if request was /drivers?foo=bar
  let foo = req.query.foo 
})

router.post('/drivers', function(req, res) {
  let body = req.body
})

正如我所说,这里有几件事情在起作用。如果您不知所措,请将问题分解成多个部分。在转到 Angular.

之前让后端正常工作

我刚刚意识到我在复制 'res' 变量:

server/api/driver/driver.controller.js:

export function index(req, res) {
  return Driver.find({company: req.params.company}).exec()
    .then(function(**res**){
       /* Should be the result, not the response */
       console.log(**res**);
       respondWithResult(**res**)
    })
    .catch(handleError(res));
}