使用GridFSBucket openDownloadStream时找不到文件错误

时间:2018-11-27 17:27:46

标签: node.js mongodb mongoose filestream gridfs

我能够使用GridFSBucket的openDownloadStream上传文件,并看到该文件已上传并且在songs.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,但存在相同的错误。有人猜到我在这里可能做错了吗?

注意-这里的代码似乎没有经过优化,就像两次声明存储桶一样,请暂时忽略它,因为一旦它起作用,我将对其进行纠正。

2 个答案:

答案 0 :(得分:1)

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

openDownloadStreamByName(filename, options)

不是openDownloadStream。 openDownloadStream需要id  文件。

答案 1 :(得分:0)

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

就我而言,我传递的是 id string 而不是 id 作为 ObjectId。

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

对比

bucket.openDownloadStream(id);