MongoDB ObjectId представляет собой 12-байтовый идентификатор,
который часто отображается в виде 24-символьной шестнадцатеричной
строки. Эта строка состоит из символов 0-9 и
a-f и не чувствительна к регистру.
Структура ObjectId логически разбивается на несколько частей:
Такое устройство обеспечивает уникальность идентификаторов без необходимости централизованной координации.
Типичный пример:
507f1f77bcf86cd799439011
Несмотря на простую строковую форму, ObjectId имеет строгие требования к формату, и любое отклонение делает значение недопустимым.
Библиотека Validator.js предоставляет встроенный метод
isMongoId, предназначенный для проверки корректности строки
как MongoDB ObjectId.
Сигнатура:
validator.isMongoId(str)
Функция возвращает:
true — если строка соответствует формату ObjectIdfalse — если формат нарушенМинимальная проверка включает:
const validator = require('validator');
console.log(validator.isMongoId('507f1f77bcf86cd799439011')); // true
console.log(validator.isMongoId('507f1f77bcf86cd79943901')); // false (23 символа)
console.log(validator.isMongoId('zz7f1f77bcf86cd799439011')); // false (недопустимые символы)
Проверка выполняется исключительно на уровне формата, без обращения к базе данных. Это важно: корректный ObjectId не гарантирует существование документа.
Validator.js допускает оба регистра — верхний и нижний:
validator.isMongoId('507F1F77BCF86CD799439011'); // true
validator.isMongoId('507f1f77bcf86cd799439011'); // true
При этом смешанные или нестандартные символы (например, пробелы или дефисы) делают значение недопустимым:
validator.isMongoId('507f1f77-bcf86cd799439011'); // false
validator.isMongoId(' 507f1f77bcf86cd799439011'); // false
ObjectId всегда содержит 24 символа:
validator.isMongoId('507f1f77bcf86cd7994390'); // false
Частая причина ошибки — обрезанные строки при передаче параметров через URL или формы.
Разрешены только шестнадцатеричные символы:
validator.isMongoId('507f1f77bcf86cd7994390zz'); // false
Любые буквы вне диапазона a-f автоматически делают
значение некорректным.
Метод ожидает строку. Передача других типов приводит к невалидному результату:
validator.isMongoId(507f1f77bcf86cd799439011); // false
validator.isMongoId(null); // false
validator.isMongoId(undefined); // false
При работе с API часто требуется предварительное приведение значения к строке.
Валидация ObjectId часто применяется при обработке параметров маршрута.
Пример проверки входного идентификатора:
const express = require('express');
const validator = require('validator');
const app = express();
app.get('/users/:id', (req, res) => {
const id = req.params.id;
if (!validator.isMongoId(id)) {
return res.status(400).send('Invalid ObjectId');
}
// дальнейшая обработка запроса
});
Такая проверка позволяет отсечь некорректные запросы до обращения к базе данных.
MongoDB Node.js драйвер предоставляет собственный класс
ObjectId, который может использоваться совместно с
Validator.js:
const { ObjectId } = require('mongodb');
const validator = require('validator');
const id = '507f1f77bcf86cd799439011';
if (validator.isMongoId(id)) {
const objectId = new ObjectId(id);
}
Проверка строкового формата перед созданием объекта снижает вероятность выброса исключений при преобразовании.
Метод isMongoId проверяет только синтаксис, но не
семантику:
Таким образом, допустимое значение может не иметь соответствующей записи в MongoDB.
При получении данных из форм или URL-параметров проверка предотвращает некорректные запросы:
if (!validator.isMongoId(userInput)) {
throw new Error('Invalid identifier format');
}
При массовых операциях часто требуется проверка списка:
const ids = ['507f1f77bcf86cd799439011', 'invalid_id'];
const allValid = ids.every(id => validator.isMongoId(id));
Снижение нагрузки на базу достигается за счёт раннего отсечения некорректных данных:
if (!validator.isMongoId(req.body.userId)) {
return res.status(400).json({ error: 'Bad ID format' });
}
Пустые строки всегда считаются невалидными:
validator.isMongoId(''); // false
validator.isMongoId(' '); // false
Даже при включённой нормализации входных данных пробелы не допускаются.
Validator.js внутренне использует регулярное выражение, эквивалентное проверке:
^[0-9a-fA-F]{24}$
Самостоятельное использование regex возможно, однако встроенный метод обеспечивает единообразие и снижает вероятность ошибок при ручной реализации.
При проектировании API часто требуется централизованная проверка идентификаторов. Validator.js позволяет унифицировать подход:
Такая модель упрощает поддержку кода в долгосрочной перспективе и снижает количество ошибок, связанных с некорректными идентификаторами.