我查看了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请求失败):
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);
}
})
})
}
答案 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
}