【问题标题】:fs.WriteFile launches callback before actually writing the filefs.WriteFile 在实际写入文件之前启动回调
【发布时间】:2020-12-16 05:29:12
【问题描述】:

我有以下快递请求回调

zip.addLocalFolder(`/path/to/folder`, `./`);
var data = zip.toBuffer();
fs.writeFile(`path/to/download.zip`,data,function (err) {
    if (err) return console.log(err);
    res.download(`path/to/download.zip`)
});

调用回调函数后fs.writeFile似乎正在写入文件。

编辑:文件写入成功。事实上,它是在我执行res.download() 之后编写的,导致错误

如果我在 setTimeout 1 秒内调用res.download(),则执行成功结束。

我收到此错误:

ENOENT:没有这样的文件或目录,stat 'path/to/download.zip`

把代码改成

zip.addLocalFolder(`/path/to/folder`, `./`);
var data = zip.toBuffer();
fs.writeFileSync(`path/to/download.zip`,data);
res.download(`path/to/download.zip`);

具有相同的效果。

我使用的库 adm-zip 有一个编写 zip 文件的方法,并且使用它具有相同的效果。

我有什么遗漏吗?

【问题讨论】:

  • fs.writeFileAsync(path/to/download.zip,data); 替换为 fs.writeFileSync(path/to/download.zip,data); 检查此 link 以在 nodejs 中同步文件写入。跨度>
  • @LilFlower ,事实并非如此。它仍然会失败,因为问题来自文件的不正确/不存在的路径。
  • @LilFlower 你是对的,我的错,尽管它仍然失败

标签: javascript node.js express


【解决方案1】:

这里的问题是,如果所选文件夹不存在,nodejs 中的本机文件写入方法将失败。 因此,在写信给path/to/folder/download.zip 之前,您需要确保所有这些文件夹path/to/folder 已经存在。

实现这一目标的方法很少。例如 Node v10.12 中可用的 fs.mkdir 方法

fs.mkdir('/path/to/folder', { recursive: true }, (err) => {
  if (err) throw err;
  ... your write file code here
});

在上面的例子中,node会首先创建路径下的所有文件夹(见recursive:true选项),然后你可以在那里写文件。

重要提示

如果您确定所有目录都存在,那么问题是传递给该方法的路径错误。考虑使用全局 __dirname variable 以解析脚本文件目录的正确路径。如果路径应该相对于应用程序执行的位置,您也可以在路径中使用./ 前缀。

【讨论】:

  • 问题是它们存在。返回错误的是 res.download() 因为它找不到文件。 fs.writeFile,实际写入文件成功。问题是,在调用回调之后,写入完成。
  • 如果我在 1 秒的 setTimeout 中调用 res.download(),则执行成功结束
  • 更新 - 你是非常正确的,我是非常错误的。我的代码中的文件名延续了 Date.now() 以保留为时间戳。结果是文件编写器中的 Date.now() 与另一个不同我的错误:D
  • @IonutEugen ,很高兴你发现 :)如果您喜欢使用时间戳作为一种 id(这是一个非常糟糕的主意),那么首先将 Date.now() 结果分配给一个变量,然后在任何需要的地方使用该变量,不要再次调用 Date.now()因为即使在同步代码中也不相同。
猜你喜欢
  • 2021-01-01
  • 2017-09-14
  • 1970-01-01
  • 2019-01-09
  • 2019-01-26
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-10-09
相关资源
最近更新 更多