Создание нескольких сегментов с помощью 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() - это всего лишь вариант, не самый безопасный, но он отлично подходит для тестирования вашего кода.