Задать вопрос
ms-dred
@ms-dred
Вечно что то не то и что то не так...

Можно ли получить ID дубля при ошибки сохранения документа?

У меня есть коллекция с уникальным полем (field)
При сохранении записи вылетает ошибка 11000, тут все хорошо, но можно ли как то изменить эту ошибку к примеру в схеме mongoose, чтобы по мимо ошибки указывался ID дубликата? Мне нужно сделать в случае совпадения, изменить/расширить запись, и приходится искать дубликат либо до сохранения, либо после попытки сохранить, это не удобно...

Сейчас делаю проверку перед сохранением что то вроде того
function saveCollect(request) {
    return Collect.findOne({field: "слово"}).then(e => {
        return null === e
            ? new Collect({field: "слово"}).save()
            : errorDuplicate(e)
    })
}

function errorDuplicate(request) {
    return throw Error(`<a href="/fields/${request._id}/">дубликат</a>`) // вывожу ссылку чтобы изменить/дополнить документ
}


Хочется сделать чтобы при сохранении можно было отловить ID документа без костылей выше
exports.post = (request, response, next) => {
    const makeRequest = async () => {
        await saveCollect(request.body.field)
        return response.end()
    }
      
    return makeRequest()
        .catch(e => {
            // При коде 11000 хотелось бы видеть ID документа, быть может это можно настроить в схеме монгуса?!
            return errors(403, e.message)
        })
}

function saveCollect(request) {
    return Collect({field: request}).save()
}


Вообще не понимаю почему этого не сделано по дефолту, монго выплевывет ошибку дубликата, но при этом сообщение никакой смысловой нагрузки в себе не несет, что за дубль, какой дубль, какой документ идентичен, вот и приходится делать 2 запроса вместо одного.
  • Вопрос задан
  • 34 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@Che603000
c 2011 javascript
Действительно невозможно получить id документа в ошибке 11000.
С другой стороны, поле ко которому вы ищите также является ключом, так как поле уникальное. Отсюда следует, что вы можете найти документ по этому полю. Как вариант вы можете сделать
function errorDuplicate(field) {
    return throw Error(`<a href="/fields/${field}/">дубликат</a>`) // вывожу ссылку чтобы изменить/дополнить документ
}

Хотя для этого, возможно придётся изменить АПИ на сервере.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы