0

excel4node写入文件函数捕获错误并且不会传播给调用者。因此,我的应用程序无法确定写入文件是否成功。

我目前的解决方法如下:

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

它有效,但我认为这是一种 hack,而且它在语义上不是正确的方式。我也测试了fs.accessand fs.accessSync,但他们只检查权限,而不是资源的状态(忙碌/锁定)。

有什么建议可以在不修改 excel4node 源代码的情况下看起来和表现得更好吗?

4

2 回答 2

2

我想你问错问题了。如果您在时间 T 检查,然后在时间 T + 1ms 写入,那么如何保证文件仍然可写?

如果文件由于某种原因不可写入,则写入将失败,句号。没事做。您的代码很好,但您也可以不使用fs.writeFileSync(),它只会删除文件中之前的所有内容。

您还可以写入随机生成的文件路径,以合理地确保两个进程不会同时写入同一个文件,但同样,这不会阻止所有可能的写入错误,所以您真正想要的是而是一些很好的错误处理。

为了正确处理错误,您必须提供回调

类似于以下内容:

excel4nodeWorkbook.write(filePath, (err) => {
  if (err) console.error(err);
});

请注意,这是异步代码,因此您也需要处理它!

于 2019-01-01T14:15:20.187 回答
1

您已经在库的源代码中标记了一行。如果您查看上面的几行,您可以看到它使用handler参数将任何错误传递给。事实上,查看函数上方的文档注释,它说:

如果给出回调,则使用 (err, fs.Stats) 调用的回调传递

因此,您可以简单地传递一个函数作为您的第二个参数,并检查err您可能已经在节点环境中的其他地方看到的内容:

excel4nodeWorkbook.write(filepath, (err) => {
    if (err) {
        console.error(err);
    }
});
于 2019-01-01T14:27:29.690 回答