проверка объекта мангуста работает неправильно

#mongoose #objectid

Вопрос:

Я пробовал что-то вроде этих строк, и это неожиданно вернулось правдой!!

  • мохамма22144
  • мохамма22145

достаточно ли надежна эта функция?

 mongoose.Types.ObjectId.isValid('mohamma22145')
 

Ответ №1:

isValid() и isValidObjectId() возвращает true, даже если строка не является идентификатором объекта. Согласно документам

Возвращает true, если Мангуст может привести заданное значение к объекту, или false в противном случае.

Если вы хотите проверить, является ли это реальным объектом, вы можете использовать это регулярное выражение: /^[a-fd]{24}$/i

Пример здесь:

 var regex = new RegExp(/^[a-fd]{24}$/i);
const ids = ['1', 'mohamma22145', '5a934e000102030405000000', 'FFFFFFFFFFFFFFFFFFFFFFFF']
ids.forEach(id => console.log(`${id} is an ObjectId: ${regex.test(id)}`)) 

Ответ №2:

ObjectId.isValid(идентификатор) возвращает значение true даже для недопустимых строк длиной 12. Например :

 String ID                |   ObjectId.isValid(id)  |    Expected Validation               
---------------------------------------------------------------------------
594ced02ed345b2b049222c5 |  true                   |  true
dania                    |  false                  |  false
toptoptoptop             |  true(but isnt)         |  false
daniandanian             |  true(but isnt)         |  false
---------------------------------------------------------------------------
 

Чтобы предотвратить такие случаи, после валидатора по умолчанию может быть добавлена другая проверка, которая вернет значение true или false в зависимости от условия (новый объект, созданный из строки), приведенного к строке === строка
, т. е. (Строка)(новый объект(идентификатор)) === идентификатор

Функция может быть создана следующим образом, чтобы проверить, является ли строка допустимым объектом или нет:

 // Requiring ObjectId from mongoose npm package
const ObjectId = require('mongoose').Types.ObjectId;
  
// Validator function
function isValidObjectId(id){
      
    if(ObjectId.isValid(id)){
        if((String)(new ObjectId(id)) === id)
            return true;        
        return false;
    }
    return false;
}
  
// Loading testcases into array
const testStrings = [ "594ced02ed345b2b049222c5","geeks",  
                      "toptoptoptop","geeksfogeeks"];
  
// Validating each test case
for(const testcase of testStrings){
  
    if(isValidObjectId(testcase))
        console.log(testcase   " is a valid MongodbID");
    else
        console.log(testcase   " is not a valid MongodbID");
  
}
 

И результат был бы:

 String ID                |   ObjectId.isValid(id)  |    Expected Validation               
---------------------------------------------------------------------------
594ced02ed345b2b049222c5 |  true                   |  true
dania                    |  false                  |  false
toptoptoptop             |  false                  |  false
daniandanian             |  false                  |  false