Валидация MongoDB ObjectId

MongoDB ObjectId представляет собой 12-байтовый идентификатор, который часто отображается в виде 24-символьной шестнадцатеричной строки. Эта строка состоит из символов 0-9 и a-f и не чувствительна к регистру.

Структура ObjectId логически разбивается на несколько частей:

  • 4 байта — временная метка создания
  • 5 байт — случайное значение (уникальность процесса и машины)
  • 3 байта — инкрементируемый счётчик

Такое устройство обеспечивает уникальность идентификаторов без необходимости централизованной координации.

Типичный пример:

507f1f77bcf86cd799439011

Несмотря на простую строковую форму, ObjectId имеет строгие требования к формату, и любое отклонение делает значение недопустимым.


Проверка формата ObjectId в Validator.js

Библиотека Validator.js предоставляет встроенный метод isMongoId, предназначенный для проверки корректности строки как MongoDB ObjectId.

Сигнатура:

validator.isMongoId(str)

Функция возвращает:

  • true — если строка соответствует формату ObjectId
  • false — если формат нарушен

Минимальная проверка включает:

  • длину строки (ровно 24 символа)
  • допустимые символы (только шестнадцатеричные)
  • отсутствие недопустимых префиксов или суффиксов

Базовое использование isMongoId

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

Неполная длина строки

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 драйвером

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);
}

Проверка строкового формата перед созданием объекта снижает вероятность выброса исключений при преобразовании.


Ограничения проверки Validator.js

Метод isMongoId проверяет только синтаксис, но не семантику:

  • не проверяет существование документа в базе
  • не определяет принадлежность к конкретной коллекции
  • не гарантирует корректность временной части ObjectId

Таким образом, допустимое значение может не иметь соответствующей записи в 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 позволяет унифицировать подход:

  • единый метод проверки для всех слоёв приложения
  • отсутствие дублирования регулярных выражений
  • предсказуемое поведение при разных входных данных

Такая модель упрощает поддержку кода в долгосрочной перспективе и снижает количество ошибок, связанных с некорректными идентификаторами.