Node.js 我可以使用此方案安全地包装函数吗?
我想包装几个fs函数,这样每个函数都会在出错时重试,直到成功 我的目的是包装这些函数,同时保持其余代码完全不变 以下是我的计划: 首先,我实现了以下名为fix.js的文件: 然后,在我的代码中,在fs=requirefs之后,我立即调用require./fixfs 这个方案是否更安全,或者我是否应该担心任何未定义的行为Node.js 我可以使用此方案安全地包装函数吗?,node.js,Node.js,我想包装几个fs函数,这样每个函数都会在出错时重试,直到成功 我的目的是包装这些函数,同时保持其余代码完全不变 以下是我的计划: 首先,我实现了以下名为fix.js的文件: 然后,在我的代码中,在fs=requirefs之后,我立即调用require./fixfs 这个方案是否更安全,或者我是否应该担心任何未定义的行为 例如,我假设fix.js文件中的_fs对象在require./fix语句执行后将继续存在,但我不确定这个假设是否正确。快速回答是肯定的,是安全的 长答案是肯定的,是安全的,但是。
例如,我假设fix.js文件中的_fs对象在require./fix语句执行后将继续存在,但我不确定这个假设是否正确。快速回答是肯定的,是安全的 长答案是肯定的,是安全的,但是。。。。解释: 是安全的,因为它会像你期望的那样工作,不会损坏任何东西。在这里之前,一切都很好 如果您得到的错误在手动执行某些操作之前无法解决,则会出现问题。例如,权限错误。代码将永远循环,直到您手动解决此问题,也可能会阻塞CPU或磁盘I/O,并且如果不免费占用CPU,就不可能在重试之间添加小的延迟。这实际上就是同步函数的问题 如果您遇到了在其他帖子中提到的EBUSY问题,它将占用整个循环中的一个CPU和大量磁盘I/O操作,直到文件不忙为止,因此有可能会减慢其他进程对文件所做的操作。如果你只有一个核心,操作会慢很多。这不是最优的。如果情况复杂,则必须避免使用同步fs函数。现在最好使用fs非阻塞函数,并在下次检查之前等待一段时间。在这里,等待一个滴答声实际上是优化的一个变化。您可以尝试使用async和Wait来保持内联的感觉,不需要回调,但可以释放事件循环,而不占用额外的CPU和磁盘I/O
顺便说一下,这些都是额外的细节。通常,封装fs函数是安全的。另一个进程是我希望不存在的进程。因此,在我的例子中没有性能问题,而不是我的脚本失败,它只会进行一些打印,直到它可以继续。非常感谢你!!!
const _fs = {};
module.exports = function(fs) {
for (const funcName of ["readFileSync", "writeFileSync", "appendFileSync"]) {
_fs[funcName] = fs[funcName];
fs[funcName] = function(...args) {
while (true) {
try {
return _fs[funcName](...args);
}
catch (error) {
console.log(error.message);
}
}
};
}
};