菜鸟问个问题,求大神解答(Nodejs中mongoos如何操作mongodb gridfs)
菜鸟问个问题,求大神解答(Nodejs中mongoos如何操作mongodb gridfs)
我想做个blog网站,用来学习js练手的,社区的推荐的那个入门网站稍显简单,现在要实现一个文件存储功能开始的学习的时候使用的mongodb的nodejs driver,由于写起来繁琐,换成了mongoose,确实简单很多。可是想使用mongodb 自带的gridfs 存储文件时发现 mongoose api 没用此接口,瞬间白痴了
后来 看mongodb driver 里面是能使用gridfs 的。
###大神们,我要怎么弄? 难道又要整回去成mongdb 么,mongodb 的连接,关闭都要自己控制,好麻烦啊!
当然可以,下面是一个详细的示例,展示如何在 Node.js 中使用 Mongoose 和 MongoDB GridFS 进行文件存储。
如何在 Node.js 中使用 Mongoose 和 MongoDB GridFS
首先,确保你已经安装了必要的依赖包:
npm install mongoose multer gridfs-storage
接下来,我们来设置一个简单的示例代码,展示如何使用 Mongoose 和 MongoDB GridFS 来存储文件。
示例代码
-
初始化项目
创建一个新的 Node.js 项目,并在
package.json
文件中添加依赖项。 -
连接 MongoDB 并配置 GridFS
创建一个
db.js
文件,用于初始化 MongoDB 连接并配置 GridFS。const mongoose = require('mongoose'); const Grid = require('gridfs-storage'); // 连接到 MongoDB mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true, }); const conn = mongoose.connection; // 初始化 GridFS const gfs = Grid(conn.db, mongoose.mongo); // 设置存储路径 gfs.collection('uploads'); module.exports = { gfs };
-
创建文件上传路由
创建一个
routes.js
文件,用于处理文件上传请求。const express = require('express'); const multer = require('multer'); const router = express.Router(); const { gfs } = require('./db'); // 设置 Multer 存储引擎 const storage = multer.memoryStorage(); // 将文件存储在内存中 const upload = multer({ storage: storage }); // 上传文件 router.post('/upload', upload.single('file'), (req, res) => { const file = req.file; if (!file) { return res.status(400).send('No file uploaded.'); } // 保存文件到 GridFS gfs.createWriteStream({ filename: file.originalname, mode: 'w', content_type: file.mimetype, }) .on('error', (err) => { res.status(500).send(err); }) .end(file.buffer); // 使用内存中的文件缓冲区 res.send('File uploaded successfully.'); }); module.exports = router;
-
启动应用
在
app.js
文件中启动 Express 应用,并挂载路由。const express = require('express'); const app = express(); const router = require('./routes'); app.use(express.json()); app.use('/api', router); app.listen(3000, () => { console.log('Server is running on port 3000'); });
通过上述步骤,你可以使用 Mongoose 和 MongoDB GridFS 实现文件存储功能。这种方式既保持了 Mongoose 的简洁性,又充分利用了 MongoDB GridFS 的强大功能。希望这对你有所帮助!
等了半天没有人回答。高手都在睡觉?
关于这个问题…自己去看issue…为啥官方不支持… https://github.com/LearnBoost/mongoose/issues/259
####哇哥哥你真牛,啵一个
在Node.js中使用Mongoose操作MongoDB的GridFS并不是直接通过Mongoose提供的API来完成的,因为Mongoose主要针对常规的文档操作进行优化,并不直接支持GridFS。但是你可以结合Mongoose和原生的MongoDB驱动来实现这一需求。
这里有一个简单的示例,展示如何使用Mongoose模型定义其他数据,同时利用原生的MongoDB驱动进行GridFS的操作:
-
安装必要的包:
npm install mongoose mongodb
-
设置MongoDB连接:
const mongoose = require('mongoose'); const MongoClient = require('mongodb').MongoClient; mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true }); const db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); db.once('open', function() { console.log("Database connected"); }); // 创建一个GridFS bucket const Grid = require('gridfs-stream'); Grid.mongo = mongoose.mongo; const gfs = Grid(db.db, mongoose.mongo);
-
上传文件到GridFS:
const fs = require('fs'); const writestream = gfs.createWriteStream({ filename: 'myFile' }); fs.createReadStream('/path/to/myfile').pipe(writestream);
-
从GridFS读取文件:
const readstream = gfs.createReadStream({ filename: 'myFile' }); readstream.pipe(fs.createWriteStream('/path/to/destination'));
-
查询文件元数据:
gfs.files.find().toArray((err, files) => { if (!files || files.length === 0) { return res.status(404).json({ responseCode: 1, responseMessage: "No files found" }); } return res.json(files); });
这种方法允许你在保持Mongoose模型定义的同时,仍能够充分利用MongoDB的GridFS功能。这样,你既可以获得Mongoose带来的便利,也可以利用GridFS进行文件存储。