1

我正在使用 express 和 node 中的 GridFS 库。我正在尝试创建多个存储桶。例如,我已经有一个名为 avatars 的存储桶,用于存储图像。

    /* 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 文件。我在https://docs.mongodb.com/manual/core/gridfs/检查了 GridFS 的文档,它指出“您可以选择不同的存储桶名称,以及在单个数据库中创建多个存储桶。” 但是,它没有提供任何见解或步骤。有没有人使用过 GridFS 库并知道如何创建多个存储桶?

4

1 回答 1

0

您需要将另一个“新 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() 是有意义的(在文件内部: (req, file) 函数),但它也可以在不更改的情况下工作。请注意,any() 只是一个选项,它不是最安全的选项,但它非常适合测试您的代码。

于 2019-12-05T22:03:24.350 回答