当我只有一个_id的参数时,我的$ resource查询返回所有对象

时间:2014-11-22 20:12:43

标签: angularjs mongodb

我试图找到与我的id参数匹配的商店。在终端一切都很好看:

GET /admin/company?_id=5470e913d20b3dab7c13218b 200 219.590 ms - -

然后是我的资源

angular.module('mean.management').factory('Companies', ['$resource',
    function($resource) {
        return $resource('/admin/company/:companyId', {
            companyId: '@_id'
        }, {
            update: {
                method: 'PUT'
            },
            get: {method: 'GET',isArray: true}
        });
    }
]);

使用正确的_id进行搜索,但它会返回一组公司的列表,而不仅仅是一家公司。

这是控制器

    $scope.newStore = function () {
        Companies.get({
            _id: $scope.global.user.company // _id works fine
        }, function (company2) {

            console.log(company2); // this logs 40 different companies when it should be one matching the _id
        });

    };

如果我用Companies.query替换Companies.get,那就是同样的问题。没有改变任何事情。我还更改了get:{方法:' GET',isArray:false}而不是true,这只是在浏览器控制台中返回错误(因为它是一个数组)。

更新:我知道参数是正确的,因为如果我去localhost:3000 / admin / company?_id = 5470e913d20b3dab7c13218b和ctrl + f 5470e913d20b3dab7c13218b我可以在其中看到带有_id的对象。

Update2:我想我越来越接近解决方案了。如果我注释掉它,它不会返回任何文章

// routes
app.get('/admin/company', companies.all); // if I comment this, it won't return anything
app.get('/admin/company/:companyId', companies.oneCompany); // this doesn't seem to be doing anything

UPDATE3 以下是服务器端代码的一些示例

exports.oneCompany = function(req, res, next, id) {
  Company.load(id, function(err, article) {
    if (err) return next(err);
    if (!article) return next(new Error('Failed to load article ' + id));
    req.article = article;

        res.json(req.article);
    next();
  });
};

这是我试过的另一个

exports.company1 = function (req, res, next, id) {
    Company
        .findOne({
            _id: id
        })
        .exec(function (err, user) {
            if (err) return next(err);
            if (!user) return next(new Error('Failed to load User ' + id));
            req.profile = user;
            res.json(user);
            next();
        });
};

1 个答案:

答案 0 :(得分:2)

我对自己的资源非常陌生,并在上周发现了类似的事情。这里的问题是资源定义,您可以在其中生成companyId到URL路径,但在定义资源时不作为参数:

return $resource('/admin/company/:companyId', {
   companyId: '@_id'
},

你需要的只是这个:

return $resource('/admin/company') 

并将此$资源用作

app.get({_id:companies.oneCompany});

这会生成资源URL为/ admin / company?_id = XYZ。此部分在https://docs.angularjs.org/api/ngResource/service/ $ resource中记录为paramDefaults:

  

参数对象中的每个键值首先绑定到url模板   如果存在,则将任何多余的键附加到URL搜索   查询之后?。

     

给定模板/路径/:动词和参数{动词:'问候',   称呼:'Hello'}导致URL / path / greet?salutation = Hello。

希望这有帮助。