2016-01-10 7 views
0

Я новичок в мангустах и ​​угловых, и у меня проблема с методом заполнения мангуста. У меня есть следующие две мангуста схемы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 в контроллер.

+0

Ваш код на стороне сервера выглядит страшным. Что должно содержать '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

+0

Привет @marcel Я использую '' 'express''' для маршрутизации, и у меня есть' '' var Job = ... '' '(я отредактировал свой вопрос, чтобы показать это). Я следую синтаксису заполнения из этого урока (https://thinkster.io/mean-stack-tutorial#opening-rest-routes). И когда я ломаюсь, я получаю нужную запись '' 'Job''' в json. Кроме того, я планирую добавить дополнительные поля в схему '' 'Example''' в будущем. – user1893354

+0

Я также забыл добавить важный '' 'маршрутизатор. param (... '' 'code.Я обновил его. – user1893354

ответ

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 должно соответствовать тому, что вводится в контроллер.