2017-01-30 4 views
-1

Я пытаюсь сделать несколько вызовов $http на интерфейсе API для обновления моей модели.
Позвольте мне объяснить. Я хочу сохранить новый объект в моей базе данных, и как только этот объект будет сохранен, я хотел бы вернуть этот объект и выполнить еще один вызов $http, который обновляет другой объект. Вот мой код:

Модель:

var departmentSchema = mongoose.Schema({ 
    username  : { type:String,unique:true,required:true}, 
    email  : { type:String,unique:true,required:true}, 
    name   : { type:String, default:"", unique:true,required:true}, 
    stations  : { 
     type: [mongoose.Schema.Types.ObjectId], 
     ref: 'Station' 
    } 
}) 

// Method that Pushes a Station to the department 
departmentSchema.methods.pushStation = function(station) { 
    var department = this; 
    department.stations.push(station) 
}; 

API Route

router.put('/departments/:dep_id/stations/:stat_id', function(req, res, next) { 
    Station.findOne({_id: req.params.stat_id}, function(err, data1){ 
     if (err) { return next(err); } 

     var station = data1; 
     Department.findOne({_id: req.params.dep_id}, function(err, data2){ 
      if (err) { return next(err); } 

      var department = data2; 
      department.pushStation(station) 
      res.json({success:true, department:department}); 
     }); 
    }); 
}); 

Angularjs $ HTTP отступом вызовы

$scope.addNewStation = function(station){ 
    $http.post('/api/stations/', station) 
    .then(function (data) { 
     console.log(data) 
     $scope.station = data.station; 
     $http.put('/api/departments/' + $scope.department._id + '/stations/' + $scope.station._id, $scope.station) 
     .then(function (data) { 
      console.log(data); 
     }) 
     bootbox.alert("Station Created Successfully"); 

    },function (err) { 
     console.log(err) 
    }) 
} 

Я должен указать, что у меня есть $scope.department в моем URL-адресе, и это связано с тем, что я получаю эти данные из предыдущего вызова, и я не хотел толковать этот раздел с ненужным кодом.
Так что проблема заключается в том, что когда я выполняю $scope.addNewStation(...), я могу успешно добавить новую станцию, появится предупреждение о загрузке, появится первый console.log(data), но затем я получаю сообщение об ошибке на консоли: TypeError: Cannot read property '_id' of undefined, а второй console.log(data) doesn Не появляется.
Пожалуйста, скажите мне, что я делаю неправильно здесь. Мне действительно нужна помощь в этом. Благодарю.

+0

Извините, но. Невозможно увидеть scope.department._id, где установлено –

+0

Вместо того, чтобы вставлять вызовы, почему бы не использовать «водопад»? [Вот ссылка] (https://www.npmjs.com/package/async-waterfall) –

+0

Эй, @federicoscamuzzi, как я уже говорил выше, $ scope.department - это объект, который был возвращен из предыдущего вызова. И этот объект содержит $ scope.department._id. Поэтому просто предположите, что он есть. – AllJs

ответ

1

Объект в обратном вызове .then() является объектом ответа, который включает в себя статус, данные и другие атрибуты. Вы должны что-то сделать:

$http.post('/api/stations/', station) 
.then(function(response) { 
    $scope.station = response.data.station; 
}) 
+0

Да Fissio. ваше предложение ответило на мой вопрос. Спасибо за вашу помощь. – AllJs

0

Попробуйте использовать угловое обещание, также проверьте правильность инициализации станции и отдела параметров области.

var promise = $http.post('/api/stations/', station); 

promise.then(
    function(data) { 
    $scope.station = data.station; 
     console.log($scope.station, $scope.department); 
     $http.put('/api/departments/' + $scope.department._id + '/stations/' + $scope.station._id, $scope.station) 
     .then(function (data) { 
      console.log(data); 
     }); 
}); 
0

Я рекомендовал бы использовать async waterfall.

Вот пример (на внутреннем интерфейсе):

var waterfall = require('async-waterfall'); 
waterfall([ 
    function(callback){ 
     callback(null, 'param1');//the first parameter is the error - if there is one 
    }, 
    function(param2, callback){ 
     callback(null, 'param2'); 
    } 
], function(err, result){ 
    // if no errors send response back to angular 
}) 

Таким образом, вы можете обойтись без вложенных вызовов. Более подробные примеры см. В ссылке, которую я предоставил.