使用router.js中的promise来模拟error handling

我正在尝试将传感器值保存到我的mongodb数据库。 我正在使用承诺做适当的error handling。 我正在使用then()catch()但我想我没有做正确的。 我发送一个组ID,以便检查组ID是否存在,然后只存储传感器信息。 这是我的代码。

 router.post('/data/:group_id', function(req,res,next){ var group_id = req.params.group_id; User.find({group_id : group_id}).then(function(user){ var object_id = user[0]._id; var datas = req.body; var data = new Data({ user : object_id, value: datas.value, valueString : datas.valueString, sensorStatus : datas.sensorStatus, timeStamp : new Date().toJSON() }); data.save().then(function(data){ res.send('Data Saved'); }); }).catch(function(e){ if(e.code === undefined){ res.send('Group id does not exist'); }else{ res.send(e); } }); }); 

如果我发送一个不存在的组ID,它确实说组ID不存在,但如果我发送一个错误的JSON数据来保存我的传感器信息,没有错误,但我用来发送信息的邮递员应用程序获取卡住。 这是我故意使用有效的组ID生成的错误。

我是新来的,所以需要了解promise如何处理第一个错误,如果找不到group_id,第二个如果传感器的json信息是错误的。

发送到http://localhost:3000/api/data/3

 { "value1" : "79" , "valueString" : "Small data", "sensorStatus" : "false" } 

额外的信息用户和数据模型。 注意(Dint添加要求和导出部分)

 var schema = new Schema({ group_id : {type : Number, required: true}, password : {type : String, default: null}, project : {type : String , default : null} }); var schema = new Schema({ user: {type: Schema.Types.ObjectId, ref: 'User'}, value :{type : Number , required : true} , valueString : {type : String, required : true}, sensorStatus : {type : Boolean , default : 0}, timeStamp : {type :String , required : true} }); 

对,你陷入了一个常见的陷阱:不要嵌套。然后.then()子句,而是返回承诺和链:

不要这样做

 foo().then(() => { bar().then(() => { baz(); } } 

.then()和chain的内部返回Promise,如下所示:

 foo() .then(() => { return bar(); }) .then(() => { return baz(); }); 

或者更短的版本

 foo() .then(() => bar()) .then(() => baz()); 

在你的情况下:

 router.post('/data/:group_id', function(req,res,next){ var group_id = req.params.group_id; User.find({group_id : group_id}) .then(function(user){ // bla bla bla return data.save(); }) .then(function(data){ return res.send('Data Saved'); }); .catch(function(e){ if(e.code === undefined){ res.send('Group id does not exist'); }else{ res.send(e); } }); }); 

作为一个常用的规则:总是返回抛出 .then()处理程序。