Хранилище Multer gridfs, ссылающееся на загруженный файл в новую коллекцию

Загруженный файл с использованием хранилища multer gridfs. Я хочу сослаться на вновь созданную коллекцию (фильмы). FileID, на который я ссылаюсь в загруженном файле, не совпадает с загруженным файлом, даже при том, что коллекция фильмов не сохраняется в базе данных. FileID, на который я ссылаюсь в загруженном файле, не совпадает с загруженным файлом, даже при том, что коллекция фильмов не сохраняется в базе данных

//movie schema
    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;

    const MovieSchema = new Schema({
     description: {
      type: String,
     },
     category: {
      type: String,
     },
     token: {
      type: String,
     },
     fileID: {
      type: Schema.Types.ObjectId,
      ref: "contents.files"
     }
    });

    module.exports = movies = mongoose.model('movies', MovieSchema);



    let gfs;

    conn.once('open', () => {
        gfs = Grid(conn.db, mongoose.mongo);
        gfs.collection('contents');

    });



    const storage = new GridFsStorage({
        url: config.db,
        file: (req, file) => {
            return new Promise((resolve, reject) => {
            
                    const filename = req.body.fileName + path.extname(file.originalname);
                    const Description = req.body.Description
                    const fileInfo = {
                        filename: filename,
                        bucketName: 'contents',
                        metadata: req.body,
                        
                    }
                    resolve(fileInfo, Description);
                
            });
        }
    });
    const   upload = multer({
        storage
    });
    router.get('/', (req, res) => {
        res.render('index');
        console.log(req.body)
    });

    //** uploading file to the db */

    router.post('/', upload.any(), (req, res) => {
        
          
        const movie = new movies({
            description: "test",
            category: "test",
            fileID: gfs.files.id
        })
        
          movie.save()
    });

Идентификатор файла отличается от идентификатора загруженного файла, а также коллекция не сохраняется в БД. Идентификатор файла отличается от идентификатора загруженного файла, а также коллекция не сохраняется в БД. Идентификатор файла отличается от идентификатора загруженного файла, а также коллекция не сохранено в БД

1 ответ

Решение

Это не работает, потому что вы делаете это сложнее, чем нужно. Ссылки в вашем файле не нужны. Вы можете сделать то же самое с этим кодом.

//movie schema
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const MovieSchema = new Schema({
  description: {
    type: String,
  },
  category: {
    type: String,
  },
  token: {
    type: String,
  },
  fileID: {
    type: Schema.Types.ObjectId, // There is no need to create references here
  }
});

module.exports = movies = mongoose.model('movies', MovieSchema);

const storage = new GridFsStorage({
  url: config.db,
  file: (req, file) => {
    return new Promise((resolve, reject) => {  
      // if you are using a separate collection to store data 
      // there is no need to save this information on the metadata
      // because you'll probably never use it
      const filename = req.body.fileName + path.extname(file.originalname);
      const fileInfo = {
        filename: filename,
        bucketName: 'contents'
      }
      resolve(fileInfo);
    });
  }
});
const upload = multer({
  storage
});

router.get('/', (req, res) => {
  res.render('index');
  console.log(req.body)
});

//** uploading file to the db */
router.post('/', upload.any(), (req, res) => {
  const movie = new movies({
    description: req.body.Description,
    category: req.body.Category,
    // Grab the file id that was stored in the database by the storage engine as the reference to your file
    fileID: req.file._id
  })

  movie.save()
});

Вы не должны использовать uploads.any(), Это примет любой входящий файл. Вместо этого вы должны использовать array, single или поля в зависимости от того, сколько файлов вы отправили и имена полей, которые вы использовали для их отправки.

Чтобы позже прочитать этот файл из базы данных, вам нужно только запросить Movies Коллекция и fileId поле имеет идентификатор, который вы можете передать GridfsBucket в openDownloadStream и направить этот поток к ответу, возвращая пользователю файл, который был сохранен с этим идентификатором, или для использования в любой бизнес-логике, имеющейся в вашем приложении.

Другие вопросы по тегам