我正在使用express,mongodb(atlas cloud)和mongoose工作我的第一个node.js rest api,当我尝试发出.remove请求时,我收到此错误:
{
"error": {
"name": "MongoError",
"message": "Cannot use (or request) retryable writes with limit=0",
"driver": true,
"index": 0,
"code": 72,
"errmsg": "Cannot use (or request) retryable writes with limit=0"
}
这是我的要求:
router.delete('/:productId', (req, res, next) => {
const id = req.params.productId;
Product.remove({ _id: id })
.exec()
.then(result => {
res.status(200).json(result);
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
})
}); ;
});
答案 0 :(得分:9)
findOneAndRemove()函数会相应地工作,因为它特定于函数.findOneAndRemove(filter,options)中传递的过滤方法,以删除过滤后的对象。但是,如果删除过程被连接中断, retryRewrites = true 将在连接时尝试执行该功能。
更多信息here
当使用retryRewrites设置为true时,MongoDB会再次重试相同的进程,这实际上有助于防止与数据库的连接失败并正常运行,因此建议将其打开。
更多信息here
如果你使用的是Mongoose 5 ^和MongoDB 3.6,你的代码写得更好:
mongoose.connect('mongodb.....mongodb.net/test?retryWrites=true', (err) => {
if(err){
console.log("Could not connect to MongoDB (DATA CENTER) ");
}else{
console.log("DATA CENTER - Connected")
}
});// CONNECTING TO MONGODB v. 3.6
router.delete('/:productId', (req, res, next) => {
const id = req.params.productId;
Product.findOneAndRemove({ _id: id })//updated function from .remove()
.exec()
.then(result => {
res.status(200).json({
message: "Product Removed Successfuly"
});
})
.catch(err => {
console.log(err);
res.status(500).json({
error: err
})
}); ;
});
答案 1 :(得分:4)
我只是在retryWrites=true
中将true更改为false并且它有效。这是一个好方法吗?或者有更好的方法来解决这个问题?
答案 2 :(得分:3)
retryWrites=true
是一件好事,这种不兼容性的解决方法是使用findOneAndRemove
代替remove
(看起来你正在使用猫鼬)