duc*_*egg 7 synchronous mongoose node.js restify
我正在设计客户端/服务器同步功能.客户端向服务器发送一堆已更改的事件.服务器将根据请求的项目状态进行创建,删除或修改.在数据库操作之后,服务器需要将摘要发送回客户端.
下面是我的服务器端代码的摘录,设计有mongoose和restify.
var EventModel = mongoose.model('Event', eventSchema);
server.post("/sync", function (req, res, next) {
var events = req.params.events;
var created = [], deleted = [], updated = [];
events.forEach(function (elem) {
if (elem.status == 0) {
// Delete
EventModel.remove({ _id: elem.uuid }, function (err, event) {
if (!err) deleted.push({uuid: elem.uuid});
});
} else if (elem.status == 1) {
// Create and update uuid
var event = new EventModel(elem);
event.save(function (err, doc) {
if (!err) {
elem.uuid = event._doc._id;
created.push(elem);
}
});
} else if (elem.status == 2) {
// Update
EventModel.findOne({ _id: elem.uuid }, function (err, event) {
event.save(function (err, doc) {
if (!err) updated.push({uuid:elem.uuid});
});
});
}
});
// Notify client what are processed.
// PROBLEM: created, deleted, updated are always empty!
res.send({processed: {created: created, deleted: deleted, updated: updated}});
});
Run Code Online (Sandbox Code Playgroud)
由于猫鼬做CRUD在异步方式,响应created,deleted并updated总是空的.有没有办法让mongoose操作系列化?
正如评论中所述,您可以使用 npm async 模块。
或者,您可能更喜欢嵌套回调(但这可能会导致所谓的回调地狱,即许多嵌套回调)或利用 mongoose .then() 方法 - 请参阅http://mongoosejs.com/docs/promises .html
在这里你可以做..
EventModel.remove(args).then((removeResponse) => {
return EventModel.findOne(args);
}).then((findResponse) => {
// etc
})
Run Code Online (Sandbox Code Playgroud)
这些请求将同步发生。