mongodb 强制mongoose.save回调等待写入完成

k5ifujac  于 2022-11-03  发布在  Go
关注(0)|答案(3)|浏览(236)

我认为这很简单,但是我似乎无法让它工作。我有两个进程。一个使用数据,另一个修饰数据。它们通过队列服务连接。第一个进程“保存"文档,然后将第二个进程排队:

// 'post' is a mongoose object

post.save(function (err) {
    if (!err) {
        self.decorate('post', post.service, post.id);
    }
});

服务2收到队列消息,然后尝试查询队列。但是没有找到项目。项目确实被写入,如果我在几秒钟后重新运行队列消息,它会正确地找到它。
看起来第二个服务正在尝试在写入完成之前运行。
如何强制Mongoose回调同步等待/执行?我尝试过在命令行中添加“safe:true'添加到连接选项。

3z6pesqy

3z6pesqy1#

请考虑在保存()方法中使用promise。

post.save().then(function (savedPost) {
    self.decorate('post', savedPost.service, savedPost.id);
});
imzjd6km

imzjd6km2#

处理错误也是很好的,所以下面的代码可以满足你的需要。

yourModel.save().then(function(savedData){
    // do something with saved data
}).catch(function(err){
    // some error occurred while saving, like any required field missing
    throw new Error(err.message);
});

如果您只想为保存返回true/false,则执行以下操作:

someFunction() {
    return yourModel.save().then(function(savedData){
        return true;
    }).catch(function(err){
        return false;
    });
}
xt0899hw

xt0899hw3#

我遇到了同样的问题。我在程序中使用async/await。首先我检查是否可以建立连接。连接也会返回一个promise。建立连接后,我将一个新的帖子保存到数据库中,并返回保存的帖子,因为我想在编辑页面中显示保存的帖子,我需要新创建的ID。
我的路由器如下所示:

/**
 * create a post page
 * @param {object} req - request from web
 * @param {object} res - response for rendering view
 * @param {object} next - continue request processing
 */
 async postCreate(req, res, next) 
 {
  // upload image to server and then save post to database
  if (req.files != null) await this.postController.upload(req)
    .then(model => this.postEdit(req, res, next, model));

  // save post to database
  else await this.postController.create(req)
    .then(model => this.postEdit(req, res, next, model));
 }

我的控制器如下所示:

/**
 * create post in database
 * @param {object} req - request with form data in it.
 * @returns {Promise<PostModel>} - returns created post
 */
 async create(req)
 {
    // fill dto object
    postDto.template = "home";

    // image of post
    if (req.files)
        postDto.images = req.files.name;

    // create post
    return await this.postService.create(postDto);
}

我的服务如下所示:

/**
 * create new post in database
 * @param {object} post - post object with data in it
 */
async create(post) {

    // make post available in post service
    this.dto = post;  

    return await this.connect()
        .then(() => {
            let postModel = new PostModel(this.dto);
            postModel._id = this.getNewId();            
            return postModel.save(); 
        });
}

这些承诺被链接起来,因此服务等待直到帖子被保存,然后继续显示可被修改的编辑页面。

相关问题