我正在尝试将参数传递给后端路由,该路由将查询我的数据库以查找相应的信息,而无需为数百个不同的项目编写重复的代码。我的问题是:我只返回一个空数组;没有错误。有什么想法吗??这是一些代码:
Mongo中的数据:
材料收集
{"material_name": "Something"},
{"material_name": "Another Something"}
服务器/路线:
app.get('/materials/:name', (req, res) => {
if (req.params.name) {
db.collection('materials').find({"material_name": req.params.name}).toArray(function(err, results) {
res.json(results);
});
}
});
工厂:
angular.module("marbleApp")
.factory('materialFactory', function($q, $http) {
return {
getMaterialStuff: function() {
var deferred = $q.defer(),
httpPromise = $http.get('/materials/:name');
httpPromise.success(function(materials) {
deferred.resolve(materials);
})
.error(function(error) {
console.log('Error...');
});
return deferred.promise;
}
};
});
控制器:
.controller('MatInfoCtrl', function($scope, materialFactory, $stateParams) {
$scope.materialStuff = {};
materialFactory.getMaterialStuff()
.then(function(materials) {
$scope.materialStuff = materials;
console.log(materials);
}, function(error) {
console.log(error);
});
$scope.name = $stateParams.materialName;
$scope.category_name = $stateParams.categoryId;
});
状态:
.state('material', {
url: '/materials/:name',
templateUrl: '/public/views/partials-matInfo.html',
controller: 'MatInfoCtrl'
});
编辑:这是我用来查询mongodb的路线。我在一个console.log中滑了一下,结果是“未定义”.... 任何想法为什么??事情显然没有连接/被传递。
app.get('/material/:name', (req, res) => {
db.collection('materials').find({"material_name": req.params.name}).toArray(function(err, results) {
console.log(req.params.name);
res.json(results);
});
});
答案 0 :(得分:1)
您的请求总是要求--id-type INTEGER
,它应该用实际名称替换/materials/:name
:
:name
答案 1 :(得分:0)
当您向服务器发送路径为app.get('/materials/:name'
的请求时,您应该使用您的名称值而不是:name
来代替$http.get('/materials/yourName')
你可以关注:
在您的控制器中
$scope.name = $stateParams.materialName;
materialFactory.getMaterialStuff($scope.name).then(function(response){
console.log('success', response.data);// check success data
//rest of code
}, function(response) {
console.log('error', response.data);// check error data
})
并在您的服务/工厂中:
getMaterialStuff: function(name) {// get name from controller
return $http.get('/materials/'+name); // used name
//By default $http return promise so no need to use $q.defer()
}
服务器路由:
app.get('/materials/:name', (req, res) => {
console.log('param name =', req.params.name); // check request params name
if (req.params.name) {
db.collection('materials').find({"material_name": req.params.name}).toArray(function(err, results) {
if(err) {
return res.status(400).send(err); // if error return with error data
}
return res.status(200).send(results);// if success return result
});
}
});
答案 2 :(得分:0)
所以我明白了。我没有将material_name作为控件使用的变量传递,然后可以将其用作route / GET到数据库的参数。
我用了一个ui-sref:
<div class="col m3" dir-paginate="material in graniteStuff | itemsPerPage: 20">
<a ui-sref="material({name: material.material_name})">
然后将我的控制器更改为:
$scope.name = $stateParams.name;
materialFactory.getMaterialStuff($scope.name)
然后将其传递给我的服务:
getMaterialStuff: function(name) {
var deferred = $q.defer(),
httpPromise = $http.get('/material/' +name);
然后将参数传递给路线:
app.get('/material/:name', (req, res) => {
db.collection('materials').find({"material_name": req.params.name}).toArray(function(err, results) {
console.log(req.params.name);
res.json(results);
});
});
感谢所有的帮助!