#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