Мангуст и проблема угловатых

0

Я новичок в 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 в контроллер.

  • 0
    Ваш серверный код выглядит странным. Что должно содержать 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 ?
  • 0
    Привет @marcel Я использую express для маршрутизации, и у меня есть var Job = ... (я отредактировал мой вопрос, чтобы показать это). Я придерживаюсь синтаксиса заполнения из этого урока . И когда я скручиваюсь, я получаю нужную Job в JSON. Кроме того, в будущем я планирую добавить дополнительные поля в схему Example .
Показать ещё 1 комментарий
Теги:
mongoose

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню