Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用mongoose和nodejs进行同步调用_Node.js_Mongoose_Synchronous_Restify - Fatal编程技术网

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

Node.js 如何使用mongoose和nodejs进行同步调用,node.js,mongoose,synchronous,restify,Node.js,Mongoose,Synchronous,Restify,我正在设计客户端/服务器同步功能。客户端向服务器发送一组更改的事件。服务器将根据请求的项目状态进行创建、删除或修改。数据库操作完成后,服务器需要将摘要发送回客户端 下面是我的服务器端代码的摘录,它是用mongoose和restify设计的 var EventModel = mongoose.model('Event', eventSchema); server.post("/sync", function (req, res, next) { var events = req.param

我正在设计客户端/服务器同步功能。客户端向服务器发送一组更改的事件。服务器将根据请求的项目状态进行创建、删除或修改。数据库操作完成后,服务器需要将摘要发送回客户端

下面是我的服务器端代码的摘录,它是用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以异步方式执行CRUD,因此创建的
响应、删除的
响应和更新的
响应始终为空。

有没有办法让mongoose操作串联起来?

如评论中所述,您可以使用npm异步模块

或者,您可能更喜欢嵌套回调(但这可能会导致所谓的回调地狱,即许多嵌套回调),或者利用mongoose.then()方法-请参阅

在这里你可以做

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

这些请求将同步发生。

您需要学习如何编写异步代码。请特别注意
async.forEach
,它将为您处理回调,并让您在一切完成后运行。请查看此链接-再看一次-谢谢@harpreethingh。异步工作得很好。我想知道,哪个链接适合你(第一个还是第二个)?。