【发布时间】: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中? -
嗨@marcel,我正在使用
express进行路由,我确实有var Job = ...(我编辑了我的问题以显示这一点)。我正在遵循this tutorial 的填充语法。当我卷曲时,我确实在 json 中获得了所需的Job记录。另外,我计划将来在Example架构中添加更多字段。 -
我也忘了添加重要的
router. param(...代码。我已经更新了。
标签: angularjs node.js mongoose