Node.js fs.writeFileSync有选项和回调和错误hundler?

时间:2018-04-26 01:21:04

标签: javascript node.js fs

我查看了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(文件,数据[,选项])

  

fs.writeFile()的同步版本。

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

这里是我的最终版本的代码,但是它仍然存在解码二进制文件的问题(可以是任何文件类型)(*当我尝试使用Axios.js时的方式我看到错误:"状态代码500请求失败): enter image description here

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);
      }

    })

  })

}

3 个答案:

答案 0 :(得分:3)

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

  

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

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

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

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

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

答案 1 :(得分:1)

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

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

并且您不需要回拨,因为它是同步的 只需在调用writeFileSync

后输入您的代码即可

答案 2 :(得分:1)

我建议你可以使用

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