Возможно ли, что Date.now() для имен файлов создает коллизии?

#javascript #node.js #multer

#javascript #node.js #мультер

Вопрос:

Я использую промежуточное ПО Multer в приложении Node / Express для отправки изображений во внешний интерфейс Vue. Я читал, что использование Date.now() предотвратит коллизию имен файлов, но я разрабатываю это с целью добавления функциональности в более крупное приложение, поэтому я хочу знать, возможно ли, что при использовании Date.now() приложение создает дублированные файлы с той же временной меткой. Мой код следующий:

 const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'public/img'); // Destination folder for uploaded pictures to serve them
    },
    filename: (req, file, cb) => {
        const ext = file.mimetype.split('/')[1];
        cb(null, `pic-${Date.now()}.${ext}`);
    }
});
 

Мне интересно, есть ли возможность (и как ее достичь) получить два изображения с одинаковым именем, потому что метод, который я использую, позволяет загружать несколько файлов одновременно, и я не знаю, может ли функция Date.now() выполняться так быстро, чтоон генерирует один и тот же результат дважды. Я оставил функцию POST своего сервера просто для добавления большего контекста.

 app.post('/uploadmultiple', upload.array('picture'), (req, res, next) => {
    const imgArray = req.files;
    if (!imgArray) {
        const error = new Error('Please upload a valid image.');
        error.httpStatusCode = 400;
        return next(error);
    }
    res.status(201).json({ files: imgArray });
});
 

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

Комментарии:

1. Вы правы — Date.now() имеет разрешение в миллисекундах, но оно может выполняться несколько раз за 1 мс. Итак, чтобы предотвратить дублирование имени файла, вам необходимо использовать npmjs.com/package/tmp

2. Или генератор, подобный npmjs.com/package/flake-idgen

3. Большое вам спасибо! модуль flake-idgen идеально подходит для моей проблемы!