(похоже, вы используете мангуст)

тоящее время я работаю над своим первым API-интерфейсом node.js rest Express, mongodb (облако атласа) и mongoose, когда я пытаюсь сделать запрос .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
        })
    }); ;
});
 Neil Lunn11 мая 2018 г., 02:44
Можете ли вы показать значение переменной в вашем вопросе, пожалуйста. Также код, где вы выпускаетеconnect() будет полезно также. Так, на всякий случай.
 gonzarodriguezt11 мая 2018 г., 02:52
Я хорошо вижу, и да, это была проблема, URL, который я скопировал из атласа mongoDB, уже содержит в себе retryWrites = true в конце, проблема решена! Большое спасибо!
 Wan Bachtiar14 мая 2018 г., 10:05
Привет @GonzaloRodriguez, не могли бы вы подтвердить версию развертывания MongoDB Atlas? также, является ли версия mongoose, которую вы использовали, v5 или выше, или v4.11 и выше? Я только что попытался воспроизвести эту проблему, и развертывание MongoDB Atlas v3.4 не будет отображатьсяretryWrites=true в URL, хотя развертывание v3.6 будет.
 Neil Lunn11 мая 2018 г., 03:16
Ой! Вероятно, не должно быть этого в предложенном по умолчанию URL с консоли. Я бы, наверное, воспринял это как запрос в службу поддержки, потому что вижу, что другие делают то же самое, что и вы.
 Neil Lunn11 мая 2018 г., 02:36
Это странно. Вы действительно передаете что-то особенное в строку подключения или другие опции наmongoose.connect()? Я почти уверен, что все кластеры Atlas были обновлены до MongoDB 3.6 (откуда поступают повторяющиеся записи), но на самом деле не должно быть ничего «по умолчанию», которое включает эту функцию. Так что если вы делаете что-то «особенное», то пытливые умы хотели бы знать.

Ответы на вопрос(3)

Решение Вопроса

ом, поскольку она специфична для метода фильтрации, передаваемого в функцию .findOneAndRemove (фильтр, параметры) для удаления отфильтрованного объекта. Тем не менее, если процесс удаления прерывается соединением,retryRewrites = верно попытается выполнить функцию при подключении.

Больше информацииВот

При использовании значения retryRewrites, установленного в true, MongoDB сообщает, что нужно повторить тот же процесс еще раз, что фактически может помочь предотвратить сбой соединений с базой данных и работать правильно, поэтому рекомендуется включить его.

Больше информацииВот

Если вы используете 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
        })
    }); ;
});
 gonzarodriguezt06 июн. 2018 г., 01:15
Большой! Я уже решил проблему, но хорошо, теперь я понимаю, почему, отличный ответ, спасибо

retryWrites=true это хорошая вещь, обходной путь для этой несовместимости заключается в использованииfindOneAndRemove вместоremove (похоже, вы используете мангуст)

retryWrites=true и это сработало. Это хороший подход? Или есть лучший способ решить эту проблему?

 honkskillet23 мая 2018 г., 18:12
Это работает, хотя полное удаление? RetryWrites = true также сработало для меня.
 이준형27 мая 2018 г., 06:45
отличный совет! оно работает
 Sampath10 июн. 2018 г., 18:57
Не очень хороший подход.When using retryRewrites set to true tells the MongoDB to retry the same process again which in fact can help prevent failed connections to the database and operate correctly, so having it turn on is recommended. Видеть:docs.mongodb.com/manual/core/retryable-writes

Ваш ответ на вопрос