gpt4 book ai didi

node.js - 使用 Node js(express) 在 mongodb atlas 中发布时出现 UnknownReplWriteConcern 错误

转载 作者:行者123 更新时间:2023-12-03 08:45:49 25 4
gpt4 key购买 nike

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;

And above mentioned is routed File.

My data is posted in the atlas. But I am getting an error of UnknownReplWriteConcern in postman while Posting a data.

我的架构看起来像

 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);

最佳答案

昨天我遇到了这个问题,我搜索了答案并找到了你的问题。最近我找到了解决方案并且它在我的代码中有效,所以我决定与您分享。因此,如果遇到同样问题的人将通过此答案得到正确的解决方案。

在我们找到答案之前,让我们先了解一下写关注发生了什么。

早在 2012 年的 MongoDB 2.2 中,MongoDB 中的默认写入关注点就一直是 w:1

您可以使用三种不同的设置在当前 MongoDB 版本(版本 3.2.6 及更高版本)中设置写入关注:

  • w 设置:在声明写入成功之前应有多少 Node 确认写入。默认值为 1,表示主 Node 的确认就足够了。
  • j 设置:在确认之前是否必须记录写入?默认值取决于 writeConcernMajorityJournalDefault
  • writeConcernMajorityJournalDefault :如果您为写入指定 w:majority 写入关注设置而不设置 j,则隐含的 j 值是多少?默认值为true(写入应在被确认之前记录在大多数投票 Node 中)。

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

这里的特殊设置是w:majority。这意味着写入必须传播到副本集中的大多数投票 Node (以及它们的日志)才能得到确认。这可以说是最安全的设置,同时提供良好的性能,因为:

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

正如你所想象的,投票 Node 确实包括仲裁者。因此,在具有主从仲裁器设置的副本集中,w:majority 可能会在以下情况下失败:

  • 其中一个数据承载 Node 由于某种原因离线。
  • 副本集仍然在线,并且具有可写的主 Node ,因为拓扑现在是主仲裁器离线状态。
  • 使用 w:1 进行写入将照常成功,但这些写入可能会回滚(因为它没有写入大多数投票数据承载 Node )。
  • 由于仲裁器不携带数据,因此 w:majority 写入将失败(或无限期等待),因为仲裁器被计为投票 Node 。

因此,如果您计划在应用程序中使用 w:majority,则不建议使用仲裁器。

请注意,也不建议在分片集群中形成分片的 3 Node 副本集中使用仲裁器,因为 block 移动需要 w:majority。一个分片中的数据承载 Node 发生故障将对 block 迁移操作产生不利影响。

这是对写关注发生的情况的基本解释,要修复您遇到的错误,您只需从架构中删除 w: 'majority' 即可。

像这样

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

此设置修复了我的 UnknownReplWriteConcern 错误,并且效果非常好。所以希望它也能帮助你。

关于node.js - 使用 Node js(express) 在 mongodb atlas 中发布时出现 UnknownReplWriteConcern 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61525058/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com