使用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()
处理程序。