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));
}
我正在使用 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));
}