当把数据发布在 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);
昨天我遇到了这个问题,我搜索了一下答案,发现了你的问题,最近我找到了解决方法,而且在我的代码中也能用,所以我决定和你分享。所以,如果有人面临同样的问题将得到适当的解决方案,通过这个答案。
在我们开始回答之前,让我们先了解一下写关注是怎么回事。
在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
错误,并且工作得很出色。所以希望也能帮到你。