首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用GridFsStorage将文件上载到mongodb

无法使用GridFsStorage将文件上载到mongodb
EN

Stack Overflow用户
提问于 2022-04-17 12:12:17
回答 1查看 74关注 0票数 0

数据库连接文件

代码语言:javascript
复制
const mongoose = require('mongoose');
const multer = require('multer')
const {GridFsStorage} = require('multer-gridfs-storage')
const Grid = require('gridfs-stream');
const path = require('path');
const dotenv = require('dotenv');
const crypto = require('crypto')
dotenv.config( { path : 'config.env'} )
let storage;
exports.connectDB = ()=>{
    try{
        const con = mongoose.createConnection(process.env.MONGO_URL,{
            useNewUrlParser:true,
            useUnifiedTopology:true,

        })
        con.once('open', () => {
            // Init stream
           const gfs = Grid(con.db, mongoose.mongo);
            gfs.collection('uploads');
          });
        console.log(`MongoDB connected:${con}`)
    }catch(err){
        console.log(err);
        process.exit(1);
    }
} 

exports.createStorage = ()=>{
    storage = new GridFsStorage({
        url: process.env.MONGO_URL,
        file: (req, file) => {
          return new Promise((resolve, reject) => {
            crypto.randomBytes(16, (err, buf) => {
              if (err) {
                return reject(err);
              }
              const filename = buf.toString('hex') + path.extname(file.originalname);
              const fileInfo = {
                filename: filename,
                bucketName: 'uploads'
              };
              resolve(fileInfo);
            });
          });
        }
      });
      console.log('storage created')
}
exports.upload = multer({storage})

以上传为中间件发布请求

代码语言:javascript
复制
route.post('/example',database.upload.single('file'),async (req,res)=>{
    res.json({file:req.file})
})

当我用postman做一个post请求时,没有错误,但是文件没有在MongoDB上上传,也没有创建上传集合。

我打电话给connectDB和createStorage从index.js

代码语言:javascript
复制
database.connectDB();
database.createStorage();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-20 13:53:29

我解决了。问题是

代码语言:javascript
复制
exports.upload = multer({storage})

之前执行了这一行代码。

代码语言:javascript
复制
database.createStorage();

所以解决办法是

代码语言:javascript
复制
exports.createStorage = ()=>{
  storage = new GridFsStorage({
    url:process.env.MONGO_URL,
    // db:conn.connection.db,
    file: (req, file) => {
      return new Promise((resolve, reject) => {
        crypto.randomBytes(16, (err, buf) => {
          if (err) {
            return reject(err);
          }
          const filename = buf.toString('hex') + path.extname(file.originalname);
          const fileInfo = {
            filename: filename,
            bucketName: 'uploads'
          };
          resolve(fileInfo);
        });
      });
    }
  });
  exports.upload = multer({storage})
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71901776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档