-1

I am trying to write an application which functionality includes storing files in MongoDB. I succeeded in uploading files there, with the GridFS library, but then I failed many times trying to get access to the data. I constantly get a response with internal server error while loading files metadata with this request:

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" });
}})

content-type: application/json; charset=utf-8

The other request for downloading a certain file data ruins my whole backend and I get this error:

Proxy error: Could not proxy request /api/user/getuser from localhost:3000 to http://localhost:4000/ (ECONNREFUSED).

After that none of my requests work properly on any page.

And that's a nodejs code of that request:

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 configurations are next:

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);
        });
      });
    }
  }); 

I assume that I missed something important in documentation, and I'm not even trying to download a whole image, I am stuck. Useful advices would be highly appreciated!

1 Answers1

1

I found the issue which caused an error! While emulating my request I got this error:

[0] Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

Therefore the problem was in that part of my code: res.status(200).json(files);

Nodejs does not allow to set the header of status after the actual body of request was sent. So all the fixes I had to do were:

res.status(200).json(files) to --> res.json(files);

I hope the solution would be useful for someone.