Мультер-хранилище gridfs, ссылающееся на загруженный файл на новую коллекцию

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

//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.info(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()
    });

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 639
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.info(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, и передать этот поток в ответ, возвращающий пользователю файл, который был сохранен с этим id или использовать в любой бизнес-логике вашего приложения.

Единственная проблема сейчас в том, что схема фильма не сохраняется в базе данных.

Sadiq Mustapha Aji 30.11.2018 21:04

Я не обновляю коллекцию @devconcept

Sadiq Mustapha Aji 30.11.2018 21:36

Проверьте документы мангуста. Я не уверен, откуда взялся new movies, поэтому я не могу вам помочь с этой частью кода.

devconcept 30.11.2018 21:38

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