【问题标题】:File not found error when using GridFSBucket openDownloadStream使用 GridFSBucket openDownloadStream 时找不到文件错误
【发布时间】:2019-04-29 12:15:58
【问题描述】:

我能够使用 GridFSBucket 的 openDownloadStream 上传文件,并看到该文件已上传并在 song.files 块下可见。但是由于某种原因,尝试下载时出现以下错误-

Caught exception: Error: FileNotFound: file def1.txt was not found

我的代码是 -

var express = require('express');
var gridModule = express.Router();
var mongoose = require('mongoose');
var fs = require('fs');

gridModule.post('/', (req, res) => {
    console.log("::::grid");
    //const gridfs = new mongoose.mongo.GridFSBucket(mongoose.connection.db);

    //const writeStream = gridfs.openUploadStream('test.dat');

    var gridfs = new mongoose.mongo.GridFSBucket(mongoose.connection.db, {
        chunkSizeBytes: 1024,
        bucketName: 'songs'
    });

    fs.createReadStream('./def.txt').
        pipe(gridfs.openUploadStream('def1.txt')).
        on('error', function (error) {
            assert.ifError(error);
        }).
        on('finish', function () {
            console.log('done!');
            process.exit(0);
        });

});

gridModule.get('/', (req, res) => {
    var gridfs = new mongoose.mongo.GridFSBucket(mongoose.connection.db, {
        chunkSizeBytes: 1024,
        bucketName: 'songs'
    });
    /* var bucket = new mongodb.GridFSBucket(db, {
        chunkSizeBytes: 1024,
        bucketName: 'songs'
      }); */

      gridfs.openDownloadStream('def1.txt').
        pipe(fs.createWriteStream('./def1.txt')).
        on('error', function(error) {
            console.log(":::error");
          assert.ifError(error);
        }).
        on('finish', function() {
          console.log('done!');
          process.exit(0);
        });
});

module.exports = gridModule;

我也尝试过使用 ObjectId id,但同样的错误。有人猜到我在这里做错了什么吗?

注意 - 这里的代码似乎没有像两次声明存储桶那样优化,请暂时忽略它,因为一旦它工作我会更正它。

【问题讨论】:

  • 你能用openDownloadStreamByName检查吗?因为如果您使用的是文件名,则应该使用该文件名
  • @AritraChakraborty,这已被弃用,不是吗?他们说here
  • 您正在检查Java api 文档。这是node js的最新v3.1 api文档
  • @AritraChakraborty,嘿,我的错。 10/10 指出这一点。 openDownloadStreamByName 工作,引用错误的链接让我很困惑。非常感谢。
  • 酷。让我将其发布为其他lost souls 的答案:-p

标签: node.js mongodb mongoose filestream gridfs


【解决方案1】:

根据 API 文档 here,为了使用 filename 作为参数,您应该使用

openDownloadStreamByName(filename, options)

不是openDownloadStream。 openDownloadStream 需要id 文件。

【讨论】:

    【解决方案2】:

    另一种可能的解释是,如果您已经调用 openDownloadStream 并且仍然遇到 FileNotFound 错误,并且您 100% 的 id 是正确的,那么您没有传递 ObjectId 类型。

    在我的例子中,我传递了一个 id string 而不是一个 id 作为 ObjectId。

    bucket.openDownloadStream(mongoose.Types.ObjectId(id));
    

    bucket.openDownloadStream(id);
    

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多