我在使用node js(express)在mongodb atlas中发帖时,得到一个UnknownReplWriteConcern的错误。

问题描述 投票:0回答:1

当把数据发布在 MongoDB 图集。

const express = require('express');
const router = express.Router();
const Persons = require('./PersonsSchema');

router.post('/',async(req,res)=>{
     console.log(req.body.Name);
     console.log(req.body.Age);
try{
    const postPerson = await new Persons({

        Name : req.body.Name,
        Age : req.body.Age
    })
    const savePersons = await postPerson.save();
    res.status(200).json(savePersons)
}

catch(err){

    res.json({"err": err})
}
});


module.exports = router;

而上面提到的是路由文件。

我的数据被发布在Atlas中。但是我在Postman中得到一个UnknownReplWriteConcern的错误,而Posting一个数据。

我的 Schema 看起来

 const mongoose = require('mongoose');

 const PersonSchema  = new mongoose.Schema({ name: String },{ age: String }, {
        writeConcern: {
          w: 'majority',
          j: true,
          wtimeout: 1000
        }
      });

module.exports = mongoose.model('Persons',PersonSchema);
node.js mongodb express mongoose
1个回答
3
投票

昨天我遇到了这个问题,我搜索了一下答案,发现了你的问题,最近我找到了解决方法,而且在我的代码中也能用,所以我决定和你分享。所以,如果有人面临同样的问题将得到适当的解决方案,通过这个答案。

在我们开始回答之前,让我们先了解一下写关注是怎么回事。

在MongoDB中,默认的写关注一直是 "写关注"。w:1 从2012年的MongoDB 2.2开始。

在当前的MongoDB版本(3.2.6和更新的版本)中,有三种不同的设置可以用来设置写关注。

  • w 设置:在宣布写入成功之前,有多少节点应该确认。默认值是1,意味着主节点的确认就足够了。
  • j 设置: 写入的内容是否必须在确认前进行记录?默认值取决于 writeConcernMajorityJournalDefault.
  • 写关注多数派日记默认:如果您指定 w:majority 写关注度设置为您的写,而不设置 j,这意味着什么?j 值?默认为 true (写的东西应该在大多数投票节点上写成日志,才会被承认)。

还有一个 wtimeout 设置 来配置MongoDB在通知客户机写入未被确认之前,应该等待多长时间来满足写关注。否则,等待写关注被满足的写可以永远等待,而不是失败。

这里的特殊设置是 w:majority. 这意味着,写入必须传播至 多数投票节点 (也是对他们的期刊)在副本集上进行确认。这可以说是最安全的设置,同时提供良好的性能,因为。

  • 它可以防止已确认的写入在发生故障时被回滚。
  • 它可以调节应用程序的吞吐量,使其发送的写入速度不会超过副本集所能处理的速度(由于硬件限制、网络情况等)。

正如你所想象的那样。投票节点确实包括仲裁者. 因此,在一个具有初级-二级-仲裁员设置的副本集中。w:majority 可能会在以下情况下失效。

  • 其中一个数据承载节点由于某种原因离线了。
  • 复制集仍然在线,有一个可写的主节点,因为拓扑现在是主仲裁器离线。
  • 写入与 w:1 会像往常一样成功,但这些写入可以被回滚(因为它没有被写入大多数有投票数据的节点)。
  • 由于仲裁器不携带数据。w:majority 写入将失败(或无限期等待),因为仲裁器被算作一个投票节点。

出于这个原因,如果你打算使用一个仲裁器,不建议使用 w:majority 在您的应用程序中。

请注意,也不建议在3节点复制集中使用仲裁器,因为在碎片集群中形成一个碎片,因为分块移动要求 w:majority. 在一个shard中出现数据承载节点故障,将不利于chunk迁移操作。

所以这就是写关注的基本解释,要想修复你所面临的错误,你只需要删除你的 w: 'majority' 从模式。

像这样

 const PersonSchema  = new mongoose.Schema({ name: String },{ age: String }, {
        writeConcern: {
          j: true,
          wtimeout: 1000
        }
      });

这个设置解决了我的 UnknownReplWriteConcern 错误,并且工作得很出色。所以希望也能帮到你。

© www.soinside.com 2019 - 2024. All rights reserved.