如何与mongoose和nodejs进行同步调用

我正在devise一个客户端/服务器同步function。 客户端发送一堆更改的事件到服务器。 服务器将根据请求的项目状态进行创build,删除或修改。 在数据库操作之后,服务器需要发送一个摘要给客户端。

下面是我的服务器端代码的摘录,devise与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}}); }); 

由于mongoose以asynchronous方式执行CRUD,因此createddeletedupdated的响应始终为空。 有什么办法让mongoose操作系列?

如注释中所述,您可以使用npmasynchronous模块。

或者,你可能更喜欢嵌套callback(但这可能导致所谓的callback地狱,即许多嵌套的callback)或利用mongoose.then()方法 – 请参阅http://mongoosejs.com/docs/promises html的

在这里你可以做..

 EventModel.remove(args).then((removeResponse) => { return EventModel.findOne(args); }).then((findResponse) => { // etc }) 

这些请求将同步发生。