【问题标题】:Mongoose and Angular Populate IssueMongoose 和 Angular 填充问题
【发布时间】:2016-01-11 11:53:13
【问题描述】:

我是 mongoose 和 Angular 的新手,我对 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。我还有以下 Express 路线,用于从特定的 Job 获取 examples。我使用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;
}]);

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

.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` 注入。这应该是指在给定 id 的resolve 中检索到的job,但看起来这不起作用。

此外,我已经卷曲了一个示例记录的 url(例如curl http://localhost:3000/jobs/56920a1329cda48f16fc0815),它确实返回了所需的Job 记录,因此看起来路由部分工作正常。我怀疑问题出在 'resolve' 或我将resolve 的结果注入控制器的方式中。

【问题讨论】:

  • 您的服务器端代码看起来很奇怪。 req.job 应该包含什么?您是否使用express 进行路由?您的模型应保存在变量中,例如:var Job = mongoose.model('Job', JobSchema);。此外,您应该像这样填充猫鼬模型:Jobs.find(/* SOME QUERY */).populate('examples').exec(function() { ...})。顺便说一句:您的Job 模型包含Examples 和Examples 包含Jobs。那是多余的....为什么不将示例内容保存为[String]Job 中?
  • 嗨@mar​​cel,我正在使用express 进行路由,我确实有var Job = ...(我编辑了我的问题以显示这一点)。我正在遵循this tutorial 的填充语法。当我卷曲时,我确实在 json 中获得了所需的 Job 记录。另外,我计划将来在Example 架构中添加更多字段。
  • 我也忘了添加重要的router. param(... 代码。我已经更新了。

标签: angularjs node.js mongoose


【解决方案1】:

好吧,这是一个愚蠢的错误。 Job 状态中的 post 应该是 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中的名字必须和控制器中注入的一致。

【讨论】:

    猜你喜欢
    • 2016-04-23
    • 2012-01-22
    • 2017-03-23
    • 2019-01-31
    • 2019-06-25
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多