【问题标题】:Cant write to file NodeJS无法写入文件NodeJS
【发布时间】:2018-12-27 21:14:40
【问题描述】:

我以前可以用几乎完全相同的方式写入文件,但是现在它给我带来了麻烦。我循环遍历这个函数,重置我在函数末尾删除的变量(参见下面的代码)。调用此函数的循环成功运行 3-9 次,然后它总是在文件写入时中断并出现此错误:

Error: ENOENT: no such file or directory, open 'screenshots/item4/record/record.html'

注意:并不总是第 4 项。

目录总是成功创建,但有时文件无法写入。代码如下:

async function save_and_erase() {
  let path = await 'screenshots/item'+recordCount;
  await makeDirectory(path);
  await makeDirectory(path+'/base');
  await makeDirectory(path+'/record');
  await saveFile(path+'/base/base.html',storage['index_html']);
  await saveFile(path+'/base/base.png',storage['index_screenshot']);
  await saveFile(path+'/record/record.html',storage['record_html']);
  await saveFile(path+'/record/record.png',storage['record_screenshot']);
  await delete storage['record_html'];
  await delete storage['record_screenshot'];
  await recordCount++;
};
async function makeDirectory(path) {
    mkdirp(path, function(err) {
        if (err) throw err;
    });
};
async function saveFile(path, content) {
    await fs.writeFile(path, content, (err) => {
        if (err) throw err;
    });
};

【问题讨论】:

  • 我认为writeFile 不会返回承诺,因此您在saveFile 中的await 将立即返回。你不是在等待mkdirp,尽管我怀疑它是否会返回一个承诺。我相信你必须使用utils.promisify 让这些命令返回承诺......

标签: javascript node.js express fs


【解决方案1】:

正如@Heretic 的评论清楚地提到writeFile 默认情况下不返回Promise 对象。

如果您使用的是最新版本的 Node,您可以查看 util 库来承诺您的功能

否则,如下更改函数即可:

function makeDirectory(path) {
    return new Promise((resolve, reject) => {
        mkdirp(path, function(err) {
            if (err) return reject(err);
            return resolve();
        }); 
    })
};
function saveFile(path, content) {
    return new Promise((resolve, reject) => {
        fs.writeFile(path, content, (err) => {
            if (err) return reject(err);
            return resolve();
        });
    })
};



请注意,您只能await 返回promise 的函数。因此,delete 和增量操作不需要 await

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    相关资源
    最近更新 更多