Я пытаюсь написать приложение, функциональность которого включает хранение файлов в MongoDB. Мне удалось загрузить туда файлы с помощью библиотеки GridFS, но потом мне много раз не удавалось получить доступ к данным. Я постоянно получаю ответ с внутренней ошибкой сервера при загрузке метаданных файлов с таким запросом:

router.get('/uploads', async (req,res) => {
try {
    gfs.files.find().toArray( (err, files) => {
        if(!files || files.length === 0) {
            return res.status(404).json({message: 'No files exisits'})
        }
    })
    res.status(200).json(files);
    
} catch (error) {
    return res.status(500).json({ message: "Could not find files, please try again" });
}})

Тип содержимого: приложение / json; charset = utf-8

Другой запрос на загрузку определенных файловых данных разрушает весь мой бэкэнд, и я получаю эту ошибку:

Ошибка прокси: не удалось запросить прокси / api / user / getuser с localhost: 3000 на http: // localhost: 4000 / (ECONNREFUSED).

После этого ни один из моих запросов не работает должным образом ни на одной странице.

И это код этого запроса nodejs:

router.get('/uploads/:filename', async (req,res) => {
try {
    gfs.files.findOne({filename: req.params.filename}, (err, file) => {
        if(!file || file.length === 0) {
            return res.status(404).json({message: 'No file exisits'})
        }
    }) 
    res.status(200).json(file);
    
} catch (error) {
    return res.status(500).json({ message: "Could not find files, please try again" });
}})

Конфигурации GridFs следующие:

const conn = mongoose.createConnection(config.get('mongoURI'));

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

const storage = new GridFsStorage({
    url: config.get('mongoURI'),
    file: (req, file) => {
      return new Promise((resolve, reject) => {
        crypto.randomBytes(15, (err, buf) => {
          if (err) {
            return reject(err);
          }
          const filename = buf.toString('hex') + path.extname(file.originalname);
          const fileInfo = {
            filename: filename,
            bucketName: 'uploads'
          };
          resolve(fileInfo);
        });
      });
    }
  }); 

Я предполагаю, что я упустил что-то важное в документации, и я даже не пытаюсь загрузить весь образ, я застрял. Будем признательны за полезные советы!

-1
Oleg Sachuk 24 Мар 2021 в 17:27

1 ответ

Лучший ответ

Я обнаружил проблему, из-за которой возникла ошибка! При эмуляции моего запроса я получил эту ошибку:

[0] Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту.

Следовательно, проблема была в этой части моего кода: res.status (200) .json (файлы);

Nodejs не позволяет устанавливать заголовок статуса после отправки фактического тела запроса. Итак, все исправления, которые мне нужно было сделать, были:

res.status (200) .json (файлы) в -> res.json (файлы);

Надеюсь, решение будет кому-то полезно.

1
Oleg Sachuk 24 Мар 2021 в 17:57