【问题标题】:Node.js fs.writeFileSync with options and callback and error hundler?带有选项、回调和错误处理程序的 Node.js fs.writeFileSync?
【发布时间】:2018-10-06 14:10:59
【问题描述】:

我查看了Node.js Documentation,但没有找到如何应用选项(设置)和带有错误处理的回调函数。而且我必须使用 .writeFileSync(不是异步 .writeFile):

const settings = {
        flags: 'w',
        encoding: null, //must be null
        mode: 0o666,
        autoClose: true //not found this option
      };

fs.writeFileSync(dest, buff, settings);

在我使用之前:

fs.writeFileSync(dest, buff, function (err) {
  if (err) { 
    ... 
  } else { ... console.log("OK") }

})

但我发现我必须应用 encoding: null, 选项来防止对源数据(buff)的任何修改,否则文件可能会被破坏。

编辑: 在得到惊人的答案和解释之后,我想说我对 Node.js 文档感到困惑: fs.writeFileSync(file, data[, options])

fs.writeFile() 的同步版本。

由于这是 fs,writeFile() 方法的版本,我认为它可以具有相同版本的函数签名...

这是我最终版本的代码,但它仍然存在解码二进制文件(可以是任何文件类型)的问题(*顺便说一下,当我尝试使用 Axios.js 时,我看到错误:“请求失败,状态码为 500):

function download(url, dest, fileName, callback) {

  //import http from 'http';
  var request = http.get(url, function (response) {

    var bodyParts = [];
    var bytes = 0;

    response.on("data", function (c) {
      bodyParts.push(c);
      bytes += c.length;
    })

    response.on("end", function () {

      // flatten into one big buffer
      var buff = new Buffer(bytes);
      var copied = 0;

      for (var i = 0; i < bodyParts.length; i++) {
        bodyParts[i].copy(buff, copied, 0);
        copied += bodyParts[i].length;
      }

      const settings = {
        flags: 'w',
        encoding: null, //not applicable / no changes
        mode: 0o666
      };

      try {
        fs.writeFileSync(dest, buff, settings);

        let msgOK = {
          filename: fileName,
          status: 'OK',
          text: `File downloaded successfully`
        }
        if (callback) callback(msgOK);
        console.log(msgOK.text);
        isLoading = false; //IMPORTANT! 

      } catch (err) {
        console.error(err.stack || err.message);

        let msgErr = {
          filename: fileName,
          status: 'ERROR',
          text: `Error in file downloading ${err.message}`
        }
        ERRORS.push(err);
        if (callback) callback(msgErr);
      }

    })

  })

}

【问题讨论】:

    标签: javascript node.js fs


    【解决方案1】:

    fs.writeFileSync 抛出错误
    所以你可以做

    try {
      fs.writeFileSync(dest, buff)
    } catch (err) {
      // do something
    }
    

    而且你不需要回调,因为它是同步的
    在调用writeFileSync之后输入你的代码

    【讨论】:

    • 谢谢。我终于明白为什么我不需要回调了
    【解决方案2】:

    我建议你可以使用

    try {
      fs.writeFileSync(dest, buff, settings);
    } catch(e) {
      // do your error handler
    }   
    

    【讨论】:

      【解决方案3】:

      任何文件系统方法的同步版本都不接受回调,它们会在出错时抛出,所以你应该抓住它。

      当使用同步形式时,任何异常都会立即抛出。 您可以使用 try/catch 来处理异常或允许它们冒泡。

      try {
          fs.writeFileSync(dest, buff);
          // You don't need callback, the file is saved here
      } catch(e) {
          console.error(e);
      }
      

      fs.writeFileSync 没有设置 autoClose,唯一可用的选项是:

      encoding <String> | <Null> default = 'utf8'
      mode <Number> default = 0o666
      flag <String> default = 'w'
      

      最后但同样重要的是,您应该更新您的节点版本,因为 Node.js 4.x end of life 不到一周。 (2018-04-30)

      【讨论】:

      • 我有一个想法:如果 fs.writeFileSync 是 fs.writeFile 的同步版本,这是否意味着我可以使用: //fs.writeFileSync(dest, buff, settings); //fs.writeFile(文件、数据、编码、回调); //fs.writeFile(file, data[, options], callback);
      • 我不明白你想说什么。之前你说要使用同步版本,为什么呢?
      • 我明白了。你已经回答了:没有带回调的同步方法:(
      • 但是如果同步了,为什么还要回调呢?
      • 仅用于在驱动器上保存文件后发送任务成功完成的确认。
      猜你喜欢
      • 1970-01-01
      • 2023-03-19
      • 2012-02-05
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多