【问题标题】:error ENOENT,open with gridFS and node js错误 ENOENT,使用 gridFS 和节点 js 打开
【发布时间】:2014-05-20 20:39:07
【问题描述】:

我正在尝试使用 GridFS 保存项目及其文件。我想先保存项目并使用项目的“_id”作为文件的元数据。

这是我的代码:

        newProject.save(function (err,project) {
        if (err) {
        console.log('save error', err);
        }
        console.log("project added");
        var id=poject._id;
        var filepath    = req.files.file.path;
        var filename    = req.files.file.name;
        var writestream = gfs.createWriteStream({ filename: filename, metadata:id });
        console.log(filepath);                                                       
        fs.createReadStream(filepath)
        .on('end', function() {

        })
        .on('error', function(err) {
        console.log("error encountered"+err);//ENOENT,open error  
        })
        .pipe(writestream);
        });

我收到以下错误:- ENOENT,打开 '/tmp/45e85388793de'

我知道当目录不存在时会出现此错误。如您所见,我在保存项目后正在编写文件,因为我需要将文件链接到项目。这就是为什么我编写了代码来将文件保存在 project.save() 的回调函数中,但它在那里不起作用。如果我将相同的代码放在 .save 块之外,则相同的代码可以完美地用于相同的路径。 (我已经显示了内部和外部的路径,它们是相同的)

【问题讨论】:

  • 如果你能提供真正的代码会很好......以及更多的上下文。您在poject._id 中有错字。你的/tmp 可以写吗?
  • 是的,我的 /tmp 是可写的。如果文件在回调函数之外,同样的代码会成功上传文件。我对这个问题进行了更多思考。当我在保存函数的回调中时,您认为这与从“tmp”目录中删除文件有关吗?

标签: javascript node.js gridfs gridfs-stream


【解决方案1】:

最后我自己解决了这个问题:-

文件保存在临时位置。当您在回调函数中时,您的文件将从该位置删除,并且您收到“没有此类文件”错误。路径和其他变量仍然作为 js 的一部分存在,这就是您能够在控制台中打印它们的原因。

解决方案:上方(外部)回调函数使用以下方法将文件移动到其他永久位置:

    fs.rename(req.files.file.path, "./someKnownPath/filename");

记下该位置。在您的回调函数中,使用新位置作为路径并尝试将文件保存在 gridfs 中。保存文件后,您可以从该位置(/someKnownPath/filename)删除它。

【讨论】:

    猜你喜欢
    • 2012-02-21
    • 2013-09-21
    • 2014-11-08
    • 2014-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多