簡體   English   中英

fs.WriteFile 在實際寫入文件之前啟動回調

[英]fs.WriteFile launches callback before actually writing the file

我有以下快速請求回調

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()之后寫入導致錯誤的

如果我在 1 秒的 setTimeout 中調用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 文件的方法,並且使用它具有非常相同的效果。

有什么我想念的嗎?

這里的問題是如果所選文件夾不存在,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變量來解析腳本文件目錄的正確路徑。 如果路徑應該相對於執行應用程序的位置,您也可以在路徑中使用./前綴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM