我正在尝试在 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)
};
接口路由
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)
})
}
我应该指出,我的 URL 中有$scope.department
,这是因为我从之前的调用中获取了该数据,并且我不想用不必要的代码挤满本节。
所以问题是,当我执行$scope.addNewStation(...)
时,我能够成功添加新站,出现引导箱警报,显示第一个console.log(data)
,但随后我在控制台上收到一个错误,指出:TypeError: Cannot read property '_id' of undefined
,第二个console.log(data)
没有出现。
请告诉我我在这里做错了什么。我真的需要这方面的帮助。谢谢。
.then()
回调中的对象是响应对象,包括状态、数据和其他属性。您应该执行以下操作:
$http.post('/api/stations/', station)
.then(function(response) {
$scope.station = response.data.station;
})
使用角度承诺尝试此操作,同时检查范围变量站和部门是否正确初始化。
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);
});
});
<</div>
div class="one_answers">我建议使用异步瀑布。
下面是一个示例(在后端):
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
})
这样,您可以不用嵌套调用。有关更好的示例,请参阅我提供的链接。