Mongoose和Angular Populate问题

时间:2016-01-10 09:32:39

标签: angularjs node.js mongoose

我是mongoose和Angular的新手,我遇到了mongoose的populate方法的问题。我有以下两个mongoose架构

var JobSchema = new mongoose.Schema({
    jobName: String,
    jobType: String,
    status: String,
    examples: [{type: mongoose.Schema.Types.ObjectId, ref: 'Example'}]
});

mongoose.model('Job', JobSchema);

var ExampleSchema = new mongoose.Schema({
    content: String,
    job: {type: mongoose.Schema.Types.ObjectId, ref: 'Job'}
});

mongoose.model('Example', ExampleSchema);

基本上Job架构包含Example。我还有以下快捷路线从特定examples获取Job。我用this tutorial来弄清楚如何做到这一点。

var Job = mongoose.model('Job');
var Example = mongoose.model('Example');

router.get('/jobs/:job', function (req, res) {

        req.job.populate('examples', function (err, job) {

            if (err) {return next(err);}

            res.json(job);
        });

    });

另外,我使用以下内容从mongo自动检索job并将其附加到req

router.param('job', function (req, res, next, id) {
    var query = Job.findById(id);

    query.exec(function (err, job) {
        if (err) {
            return next(err);
        }
        if (!job) {
            return next(new Error('can\'t find job'));
        }

        req.job = job;

        return next();
    });
});

我还有以下使用此路线的Angular工厂

app.factory('jobs', ['$http', function ($http) {
    var o = {    
        jobs: []
    };

    o.get = function (id) {
        return $http.get('/jobs/' + id).then(function (res) {
            return res.data;
        });
    };

    return o;
}]);

我还创建了以下状态,该状态应该使用上述工厂立即填充examples给定的Job id。

.state('jobs', {
                url: '/jobs/{id}',
                templateUrl: '/jobs.html',
                controller: 'NerCtrl',
                resolve: {
                    post: ['$stateParams', 'jobs', function ($stateParams, jobs) {
                        return jobs.get($stateParams.id);
                    }]
                }
            });

当我实际尝试使用控制器显示examples时出现问题。

app.controller('NerCtrl', [
    '$scope',
    'job',
    function ($scope, job) {

        $scope.examples = job.examples;

    }]);

尝试使用$scope.examples的视图只显示{{examples}}而不是范围变量的实际内容。实际上,控制器中的任何内容似乎都不适用于`job`注入(甚至不是简单的“警报”)。

看起来问题来自控制器中的`job`注入。这应该引用jobresolve给出的curl http://localhost:3000/jobs/56920a1329cda48f16fc0815,但它看起来不像这样。

此外,我已经卷曲了一个示例记录的url(例如Job)并且它确实返回了所需的resolve'记录,因此它看起来像路由部分正常工作。我怀疑问题出现在'resolve中,或者我将 /* Node is defined as typedef struct node { int data; node * left; node * right; }node; 的结果注入控制器的方式。

1 个答案:

答案 0 :(得分:0)

好的,这是一个愚蠢的错误。 post州内的Job应该是job。即。

.state('jobs', {
                url: '/jobs/{id}',
                templateUrl: '/jobs.html',
                controller: 'NerCtrl',
                resolve: {
                    job: ['$stateParams', 'jobs', function ($stateParams, jobs) {
                        return jobs.get($stateParams.id);
                    }]
                }
            });

在我缺乏经验的情况下,我不知道post指的是什么,但我认为它指的是从jobs.get($stateParams.id)返回的作业,然后是在控制器中注入的名称。显然,resolve中的名称必须与控制器中注入的名称一致。