【问题标题】:What's the issue which fails me to download data from mongodb using GridFS?我无法使用 GridFS 从 mongodb 下载数据的问题是什么?
【发布时间】:2021-06-21 06:54:43
【问题描述】:

我正在尝试编写一个应用程序,其功能包括在 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;字符集=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);
        });
      });
    }
  }); 

我假设我错过了文档中的一些重要内容,我什至没有尝试下载整个图像,我被卡住了。非常感谢有用的建议!

【问题讨论】:

  • 这不是 mongodb 错误。调试您的应用程序。
  • @D.SM 感谢您的建议,我在调试请求代码时发现了问题。

标签: javascript node.js mongodb gridfs


【解决方案1】:

我找到了导致错误的问题!在模拟我的请求时,我收到了这个错误:

[0] 错误 [ERR_HTTP_HEADERS_SENT]: 发送到客户端后无法设置标头

因此问题出在我的代码的那部分: res.status(200).json(files);

Nodejs 不允许在实际请求正文发送后设置状态标头。 所以我必须做的所有修复是:

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

我希望该解决方案对某人有用。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 2011-10-19
    相关资源
    最近更新 更多