简体   繁体   English

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

[英]How to make synchronous call with mongoose and nodejs

I'm designing a client/server synchronization feature. 我正在设计客户端/服务器同步功能。 The client sends a bunch of changed events to server. 客户端向服务器发送一堆已更改的事件。 The server will do creation, deletion or modification upon requested item status. 服务器将根据请求的项目状态进行创建,删除或修改。 After the database operation, the server need send a summary back to client. 在数据库操作之后,服务器需要将摘要发送回客户端。

Below is excerpt from my server side code, designed with mongoose and 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}});
});

Since mongoose do CRUD in async way, the response created , deleted and updated are always empty. 由于mongoose以异步方式执行CRUD,因此createddeletedupdated的响应始终为空。 Is there any way to let the mongoose operation in series? 有没有办法让mongoose操作系列化?

As stated in the comments you could use the npm async module. 如评论中所述,您可以使用npm异步模块。

Alternatively, you may prefer to nest callbacks (but this might lead to what is known as callback hell, viz many nested callbacks) or take advantage of the mongoose .then() method - see http://mongoosejs.com/docs/promises.html 或者,您可能更喜欢嵌套回调(但这可能会导致所谓的回调地狱,即许多嵌套回调)或利用mongoose .then()方法 - 请参阅http://mongoosejs.com/docs/promises html的

Here you can do .. 在这里你可以做..

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

These requests will happen synchronously. 这些请求将同步发生。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM