Я новичок в mongoose и Angular, и у меня проблема с методом заполнения мангуста. У меня есть следующие две схемы мангуста
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
. Я использовал этот учебник, чтобы выяснить, как это сделать.
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);
});
});
Кроме того, я использую следующее, чтобы автоматически получить job
от mongo и прикрепить его к 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();
});
});
У меня также есть следующий Угловой завод, который использует этот маршрут
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
используя указанную выше фабрику.
.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
заданном идентификатором, но похоже, что это не работает.
Кроме того, у меня скручивается примерный URL-адрес записи (например, curl http://localhost:3000/jobs/56920a1329cda48f16fc0815
), и он возвращает желаемую запись Job
, так что похоже, что часть маршрута работает правильно. Я подозреваю, что проблема находится где-то в " resolve'
или в том, как я вводя результат resolve
в контроллер.
Хорошо, это была глупая ошибка. 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
должно соответствовать тому, что вводится в контроллер.
req.job
? Вы используетеexpress
для маршрутизации? Ваши модели должны быть сохранены в переменных, таких как:var Job = mongoose.model('Job', JobSchema);
, Также вы должны заполнить модели мангусты, например, так:Jobs.find(/* SOME QUERY */).populate('examples').exec(function() { ...})
. Кстати, ваша модельJob
содержитExample
s, аExample
s содержитJob
s. Это излишне .... почему бы вам просто не сохранить содержимое exmaples как[String]
вJob
?express
для маршрутизации, и у меня естьvar Job = ...
(я отредактировал мой вопрос, чтобы показать это). Я придерживаюсь синтаксиса заполнения из этого урока . И когда я скручиваюсь, я получаю нужнуюJob
в JSON. Кроме того, в будущем я планирую добавить дополнительные поля в схемуExample
.