Я новичок в мангустах и угловых, и у меня проблема с методом заполнения мангуста. У меня есть следующие две мангуста схемыMongoose and Angular Populate Issue
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);
});
});
Кроме того, я использую следующие для автоматического извлечения 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();
});
});
У меня также есть следующее Угловое завод, который использует этот маршрут
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
в контроллер.
Ваш код на стороне сервера выглядит страшным. Что должно содержать 'req.job'? Используете ли вы 'express' для своей маршрутизации? ваши модели должны быть сохранены в переменных типа: 'var Job = mongoose.model ('Job', JobSchema);'. Также вы должны заполнить модели mongoose следующим образом: 'Jobs.find (/ * SOME QUERY * /). Populate ('examples'). Exec (function() {...})'.BTW: Ваша модель 'Job' содержит' Example 'и' Example 'содержит' Job '. Это избыточно ... почему бы вам просто не сохранить содержимое exmaples как '[String]' в 'Job'? – marcel
Привет @marcel Я использую '' 'express''' для маршрутизации, и у меня есть' '' var Job = ... '' '(я отредактировал свой вопрос, чтобы показать это). Я следую синтаксису заполнения из этого урока (https://thinkster.io/mean-stack-tutorial#opening-rest-routes). И когда я ломаюсь, я получаю нужную запись '' 'Job''' в json. Кроме того, я планирую добавить дополнительные поля в схему '' 'Example''' в будущем. – user1893354
Я также забыл добавить важный '' 'маршрутизатор. param (... '' 'code.Я обновил его. – user1893354