Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.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
Javascript 确保所有保存方法正常工作的正确方法:node.js、MongoDB_Javascript_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Javascript 确保所有保存方法正常工作的正确方法:node.js、MongoDB

Javascript 确保所有保存方法正常工作的正确方法:node.js、MongoDB,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我对MongoDB和Node.JS非常陌生,我有一个问题,那就是在同一个路由中实现多个save调用并确保它们都能工作,或者没有工作的正确方法是什么。我想要的是,如果一次保存失败,它们都会失败。下面是一些代码。它像预期的那样工作,没有任何问题,但我有一种感觉,这是一种糟糕的做法 正如您所看到的,我的PostSchema只是一些文本,然后是指向另一个名为Comment的对象的指针数组 var postSchema = mongoose.Schema({ text: String,

我对MongoDB和Node.JS非常陌生,我有一个问题,那就是在同一个路由中实现多个save调用并确保它们都能工作,或者没有工作的正确方法是什么。我想要的是,如果一次保存失败,它们都会失败。下面是一些代码。它像预期的那样工作,没有任何问题,但我有一种感觉,这是一种糟糕的做法

正如您所看到的,我的
Post
Schema只是一些文本,然后是指向另一个名为Comment的对象的指针数组

var postSchema = mongoose.Schema({ 
    text: String,
    comments : [{
        type : mongoose.Schema.Types.ObjectId,
        ref : "Comment"
    }]
});
我的
注释
模式。只是一些文字而已

var commentSchema = mongoose.Schema({ 
    commentText: String
});
现在,这是我的路线

apiRoutes.post("/testCreateComment", function(request, response, next){
    var commentText = request.body.commentText;
    var testID = request.body.testID
    if (!commentText || !testID) //ensures all data is there.
        return next(new Error("Not all the information required was provided."));
    var newComment = new Comment({
        commentText : commentText
    })

    newComment.save(function(err) { //first save the new TestComment.
        if (err) return next(err);
        Post.findById(testID, function(err, found){ //second find the Post object.
            if (err) return next(err);
            found.comments.push(newComment)
            found.save(function(err){ //third, save the Post object with the comment added to the array.
                if (err) return next(err);
                response.json(newComment.getReturn()); // returns some data to be sent
            })
        })
    })
})
在这条路线中,有三种方法必须成功才能使整个操作正常进行。例如,现在保存第一个
save
有效,但无论出于何种原因,
findById
都不成功。在这种情况下,我会在数据库中留下一条无用的注释


我的问题是,什么是确保所有三个操作都成功并确保上述问题不可能发生的正确方法?

既然您对此有点陌生,那么您应该将其视为原子操作符,因为这通常比“之后”操纵对象数组要好得多阅读它,当然必须再次
.save()
。出于同样的原因,我会对在另一个集合中存储注释的设计打上一个大问号,但您在对象上保留了一个数组。在此处嵌入注释可能更简单、更有效。删除保存的
注释
如果更新
post
时出现错误,此示例代码可能会对您有所帮助<代码>newComment.save(函数(err){if(err)return next(err);Post.update({u id:testID},{$push:{comments:newComment.{u id}}}},函数(err,found){if(err){comments.remove({u id:newComment.\u id},函数(err1){if(err1)return next(err1);else返回next(err);}else{response.json(newComment.getReturn();}}}})并使用
$push
向post添加注释id。@谢谢,这非常有用,尤其是对于$push@BlakesSeven我还没有考虑过嵌入评论的可能性。我一定会考虑的。谢谢。