如何将参数从角度控制器/服务传递到服务器路径,再查询数据库?

时间:2016-04-15 17:48:50

标签: angularjs mongodb express

我正在尝试将参数传递给后端路由,该路由将查询我的数据库以查找相应的信息,而无需为数百个不同的项目编写重复的代码。我的问题是:我只返回一个空数组;没有错误。有什么想法吗??这是一些代码:

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

3 个答案:

答案 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);
    });
});

感谢所有的帮助!