错误ENOENT,使用gridFS和节点js打开

时间:2014-04-08 08:55:00

标签: javascript node.js gridfs gridfs-stream

我正在尝试使用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,open' / tmp / 45e85388793de'

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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