菜鸟问个问题,求大神解答(Nodejs中mongoos如何操作mongodb gridfs)

菜鸟问个问题,求大神解答(Nodejs中mongoos如何操作mongodb gridfs)

我想做个blog网站,用来学习js练手的,社区的推荐的那个入门网站稍显简单,现在要实现一个文件存储功能开始的学习的时候使用的mongodb的nodejs driver,由于写起来繁琐,换成了mongoose,确实简单很多。可是想使用mongodb 自带的gridfs 存储文件时发现 mongoose api 没用此接口,瞬间白痴了

后来 看mongodb driver 里面是能使用gridfs 的。

###大神们,我要怎么弄? 难道又要整回去成mongdb 么,mongodb 的连接,关闭都要自己控制,好麻烦啊!


5 回复

当然可以,下面是一个详细的示例,展示如何在 Node.js 中使用 Mongoose 和 MongoDB GridFS 进行文件存储。

如何在 Node.js 中使用 Mongoose 和 MongoDB GridFS

首先,确保你已经安装了必要的依赖包:

npm install mongoose multer gridfs-storage

接下来,我们来设置一个简单的示例代码,展示如何使用 Mongoose 和 MongoDB GridFS 来存储文件。

示例代码

  1. 初始化项目

    创建一个新的 Node.js 项目,并在 package.json 文件中添加依赖项。

  2. 连接 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 };
    
  3. 创建文件上传路由

    创建一个 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;
    
  4. 启动应用

    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

你可以用这个… https://github.com/aheckmann/gridfs-stream

####哇哥哥你真牛,啵一个

在Node.js中使用Mongoose操作MongoDB的GridFS并不是直接通过Mongoose提供的API来完成的,因为Mongoose主要针对常规的文档操作进行优化,并不直接支持GridFS。但是你可以结合Mongoose和原生的MongoDB驱动来实现这一需求。

这里有一个简单的示例,展示如何使用Mongoose模型定义其他数据,同时利用原生的MongoDB驱动进行GridFS的操作:

  1. 安装必要的包:

    npm install mongoose mongodb
    
  2. 设置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);
    
  3. 上传文件到GridFS:

    const fs = require('fs');
    const writestream = gfs.createWriteStream({ filename: 'myFile' });
    fs.createReadStream('/path/to/myfile').pipe(writestream);
    
  4. 从GridFS读取文件:

    const readstream = gfs.createReadStream({ filename: 'myFile' });
    readstream.pipe(fs.createWriteStream('/path/to/destination'));
    
  5. 查询文件元数据:

    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进行文件存储。

回到顶部