使用AngularJS缩进$ http调用

时间:2017-01-30 08:28:48

标签: javascript angularjs node.js api http

我正在尝试在API界面上进行多次$http调用来更新我的模型 让我解释。我想将一个新对象保存到我的数据库中,一旦保存了该对象,我希望返回该对象并执行另一个更新另一个对象的$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路线

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,这是因为我从之前的通话中获取了这些数据,而且我不想将此部分用不必要的代码包围。 所以问题在于,当我执行$scope.addNewStation(...)时,我能够成功添加新工作站,出现引导框警报,显示第一个console.log(data),但是我在控制台上收到错误说明: TypeError: Cannot read property '_id' of undefined和第二个console.log(data)未显示 请告诉我这里做错了什么。我真的需要帮助。感谢。

3 个答案:

答案 0 :(得分:1)

.then()回调中的对象是一个响应对象,包括状态,数据和其他属性。你应该做以下事情:

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

答案 1 :(得分: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);
        });
});

答案 2 :(得分: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
})

这样您就可以不使用嵌套调用。有关更好的示例,请参阅我提供的链接。