Создание нескольких сегментов с помощью GridFS

Я работаю с библиотекой GridFS в экспресс и узел. Я пытаюсь создать несколько ведер. Например, у меня уже есть ведро под названием аватары, в котором хранятся изображения.

    /* Start of mongo connection for uploading files */
const mongoURI = "mongodb://localhost:27017/PTAdata";
const conn = mongoose.createConnection(mongoURI);


let gfs;

conn.once('open', () => {
    gfs = stream(conn.db, mongoose.mongo);
    gfs.collection('avatars');
})

const storage = new GridFs({
    url: "mongodb://localhost:27017/PTAdata",
    file: (req, file) => {
    return new Promise((resolve, reject) => {
        crypto.randomBytes(16, (err, buf) => {
        if (err) {
            return reject(err);
        }
        file.user = req.body.username
        const name = file.originalname
        const filename = buf.toString('hex') + path.extname(file.originalname);
        const fileInfo = {
            filename: file.user,
            bucketName: 'avatars'
        };
        resolve(fileInfo);
        });
    });
    }
});
const upload = multer({ storage });

Теперь я хочу создать еще одно ведро под названием audio, в котором будут храниться mp3-файлы. Я проверил документацию по GridFS по адресу https://docs.mongodb.com/manual/core/gridfs/ и там говорится, что "вы можете выбрать другое имя сегмента, а также создать несколько блоков в одной базе данных". Однако это не дает никакого понимания или шагов к тому, как. Кто-нибудь работал с библиотекой GridFS и знает, как создать несколько блоков?

0 ответов

Вам нужно сохранить другой объект "new GridFS" в другой переменной, а не передать его в multer как другое свойство хранилища. В вашем случае это должно сработать:

const storage = new GridFs({
    url: "mongodb://localhost:27017/PTAdata",
    file: (req, file) => {
    return new Promise((resolve, reject) => {
        crypto.randomBytes(16, (err, buf) => {
        if (err) {
            return reject(err);
        }
        file.user = req.body.username
        const name = file.originalname
        const filename = buf.toString('hex') + path.extname(file.originalname);
        const fileInfo = {
            filename: file.user,
            bucketName: 'avatars'
        };
        resolve(fileInfo);
        });
    });
    }
});

const anotherStorage = new GridFs({
    url: "mongodb://localhost:27017/PTAdata",
    file: (req, file) => {
    return new Promise((resolve, reject) => {
        crypto.randomBytes(16, (err, buf) => {
        if (err) {
            return reject(err);
        }
        file.user = req.body.username
        const name = file.originalname
        const filename = buf.toString('hex') + path.extname(file.originalname);
        const fileInfo = {
            filename: file.user,
            bucketName: 'mp3files'
        };
        resolve(fileInfo);
        });
    });
    }
});

const upload = multer({ storage });

const uploadSongs = multer({ storage: anotherStorage });

Наконец, вы должны выбрать между этими сегментами в соответствии с вашими конечными точками, например:

app.post('/api/uploadAvatar', upload.any(), (req, res)=> {
... do stuff
}

app.post('/api/uploadMp3', uploadSongs.any(), (req, res)=> {
... do stuff
}

Для меня имело смысл изменять gfs.collection() в каждом случае (внутри функции file: (req, file)), но она также работала без изменений. Имейте в виду, что any() - это всего лишь вариант, не самый безопасный, но он отлично подходит для тестирования вашего кода.

Другие вопросы по тегам