excel4node的write to file function catches error and does not propagate给呼叫者。因此,我的应用无法确定是否成功写入文件。
我当前的解决方法如下:
let fs = require('fs')
try {
let filePath = 'blahblah'
fs.writeFileSync(filePath, '') // Try-catch is for this statement
excel4nodeWorkbook.write(filePath)
} catch (e) {
console.log('File save is not successful')
}
它可以工作,但是我认为这是一种破解,并且不是在语义上正确的方式。我还测试了fs.access
和fs.accessSync
,但它们仅检查许可权,而不检查资源的状态(忙/锁)。
在不修改excel4node源代码的情况下,是否有任何更好的外观和表现建议?
答案 0 :(得分:1)
我认为您是在问错问题。如果您在时间T进行检查,然后在时间T + 1ms写入,那么什么可以保证文件仍然可写?
如果由于某种原因该文件不可写 ,则写入将失败。没事做。您的代码很好,但是您也可以不用fs.writeFileSync()
,它只会删除文件中的其他内容。
您还可以写入随机生成的文件路径,以确保两个进程不会同时写入同一文件,但是同样,这也不能防止所有可能的写入错误,因此,您的实际情况是,真正想要的是一些良好的错误处理。
为了正确处理错误,您必须提供callback!
类似的东西:
excel4nodeWorkbook.write(filePath, (err) => {
if (err) console.error(err);
});
当心,这是异步代码,因此您也需要处理!
答案 1 :(得分:1)
您已经在库的源代码中标记了一行。如果您在上面看几行,可以看到它使用handler
参数将任何错误传递给它。实际上,在功能上方查看文档注释时,它说:
如果提供了回调,则通过(err,fs.Stats)调用的回调将被传递
因此,您可以简单地将函数作为第二个参数传递,并检查err
,就像您可能已经在节点环境中的其他地方看到的一样:
excel4nodeWorkbook.write(filepath, (err) => {
if (err) {
console.error(err);
}
});