我是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`
注入。这应该引用job
中resolve
给出的curl http://localhost:3000/jobs/56920a1329cda48f16fc0815
,但它看起来不像这样。
此外,我已经卷曲了一个示例记录的url(例如Job
)并且它确实返回了所需的resolve'
记录,因此它看起来像路由部分正常工作。我怀疑问题出现在'resolve
中,或者我将 /*
Node is defined as
typedef struct node
{
int data;
node * left;
node * right;
}node;
的结果注入控制器的方式。
答案 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
中的名称必须与控制器中注入的名称一致。