Javascript 使用GridFS创建多个bucket

Javascript 使用GridFS创建多个bucket,javascript,mongodb,gridfs,multer-gridfs-storage,Javascript,Mongodb,Gridfs,Multer Gridfs Storage,我正在使用express和node中的GridFS库。我正在尝试创建多个bucket。例如,我已经有了一个名为avatars的bucket,它存储图像 /* Start of mongo connection for uploading files */ const mongoURI = "mongodb://localhost:27017/PTAdata"; const conn = mongoose.createConnection(mongoURI); let gfs; co

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

    /* 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的文档,它声明“您可以选择不同的bucket名称,也可以在一个数据库中创建多个bucket。”但是它没有提供任何关于如何创建的细节或步骤。是否有人使用过GridFS库并知道如何创建多个bucket?

您需要将另一个“新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
}
对我来说,在每种情况下(在file:(req,file)函数中)更改gfs.collection()都是有意义的,但它也可以在不更改的情况下工作。请注意,any()只是一个选项,虽然它不是最安全的选项,但它非常适合测试代码。

您需要将另一个“新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
}

对我来说,在每种情况下(在file:(req,file)函数中)更改gfs.collection()都是有意义的,但它也可以在不更改的情况下工作。请注意,any()只是一个选项,虽然它不是最安全的选项,但它对于测试代码非常有用。

您实际从代码中导入的
GridFs
是什么?您为
gridfs-stream
multer-gridfs-storage
添加了标记,这两个包实际上是两个不同的包,工作方式不同。您需要指定您实际使用的。仅供参考,“bucket”实际上只是集合名称的“前缀”。默认情况下,GridFs规范将
fs
fs.files
fs.chunks
一起使用,或者使用命名的“bucket”,即
avatars.files
avatars.chunks
。如果你真的想要这个数据在不同的集合中,你可能需要仔细考虑。它看起来就像你正在使用的,如果你仔细看,文档页面上有一个例子显示桶名的转换。实际上,它就在示例的顶部。请注意,还有其他示例向您展示了如何共享现有的mongoose连接。您似乎只是直接复制了“加密”代码,而不是查看所有示例的功能。我使用multer gridfs存储将文件实际存储在mongo数据库中,并使用gridfs流在浏览器中传输文件(音频和图像)。我知道bucket只是创建的两个集合的前缀,但我要做的是创建一组单独的.file和。不同桶的块。我不仅仅是想更改现有bucket的名称。您实际从代码中导入的
GridFs
是什么?您为
gridfs-stream
multer-gridfs-storage
添加了标记,这两个包实际上是两个不同的包,工作方式不同。您需要指定您实际使用的。仅供参考,“bucket”实际上只是集合名称的“前缀”。默认情况下,GridFs规范将
fs
fs.files
fs.chunks
一起使用,或者使用命名的“bucket”,即
avatars.files
avatars.chunks
。如果你真的想要这个数据在不同的集合中,你可能需要仔细考虑。它看起来就像你正在使用的,如果你仔细看,文档页面上有一个例子显示桶名的转换。实际上,它就在示例的顶部。请注意,还有其他示例向您展示了如何共享现有的mongoose连接。您似乎只是直接复制了“加密”代码,而不是查看所有示例的功能。我使用multer gridfs存储将文件实际存储在mongo数据库中,并使用gridfs流在浏览器中传输文件(音频和图像)。我知道bucket只是创建的两个集合的前缀,但我要做的是创建一组单独的.file和。不同桶的块。我不仅仅是想改变现有bucket的名称。