fs.writeFile 永远不会调用回调,WritableStream.write 也是如此,等等

fs.writeFile callback never gets called, same for WritableStream.write, etc

我正在写一个小文本文件 (~500B),但奇怪的是,如果我使用 fs.writeFile(..)(或 WriteableStream 的 write/end方法)。

这个有效:

var scanInfo = getScanInfo( core ); // returns several lines delimited by \r\n
fs.writeFileSync( filename, scanInfo, 'ascii' );

这会创建空文件并且回调函数不会产生任何输出:

var scanInfo = getScanInfo( core );
scanInfo.push('') ;
scanInfo = scanInfo.join(DOS_CRLF);
fs.writeFile( filename, scanInfo, 'ascii', function ( err ) { 
   if(err) { console.error('Failed'); console.error(err) ; }
   else { console.log('OK'); }
});

我一直在寻找类似的 post,但我发现问题出在其他地方(调用另一个函数返回内容),但我的内容是一个文本字符串(通过调试验证)。

类似post:

平台>Win8.1 x64

NodeJS> x64 0.12.0

P.S。使用实际写入文件的函数的应用程序是使用回调以 "plain nodejs" 风格编写的,但随着它变得越来越复杂,我使用 Q 和 Q-IO 重写了主处理流。 所以现在处理是这样开始的:

(在主模块中)

var qfs = require('q-io/fs') ;
...
qfs.read( configFile )
.then( doSomeConfig )
.then( function( config ) { 
    var promise = qfs.read( config.inputFile, someOptions );
    return promise ;
})
.then( processMyInputData /* (binaryData) returns {Core} */ )
.then( writeMyOutputData  /* (core)   returns {undefined} */  )
.fail( reportSomeErrors   /* (reason) returns {undefined} */ )
.done( reportFinished ) ;

关键是在主流中 fail 函数也从不报告任何问题。函数 reportFinished() 报告一切正常,没有地方可以抛出任何异常,因为上面的原始片段是位于另一个模块中的函数,作为 writeMyOutputData(core) 的一部分调用,永远不会调用回调,因此它无法进行任何异常抛出或任何类型的错误处理。

但是,在阅读了 Joseph 的评论后,我怀疑标准 fs 模块和 q-io/fs

之间可能存在一些干扰

好的,仔细调试后发现问题。正如约瑟夫提到的,与 fs.writeFile() 完全无关。

在我的应用程序中,实际上有两个文件写入 运行 "concurrently"。我的问题中列出的一个和另一个在计算一些平均值时逐渐写入数据。

另一个渐进式编写的函数有一个错误(变量名拼写错误),导致在操作过程中(在连续写入之间)抛出引用错误。这个异常,出于某种我不太明白的原因,并没有出现在链中的任何地方。根据 Q 文档,Promise.done() 应该抛出任何未处理的异常,但事实并非如此。

在 promise 链中添加了几个 fail() 处理程序后,我能够找到错误并实现整个应用程序的合理行为。

因此,该错误与错误的编程风格(未正确处理异常)有关,而不是与 fs 模块有关。但是,我无法相信会有未处理的异常这样的事情可能会丢失并且永远不会出现在白天。我也很难相信异步操作 B 中的异常会影响另一个不相关的异步操作 A.

我遇到了与 fs.stat 类似的问题 问题是我正在编写一个 grunt 任务并且该任务不知道它是异步的所以同步代码完成并在 fs.stat 回调可以被调用之前终止应用程序。

这可能不是您的问题,但可能会对其他人有所帮助。

做一个 grunt 任务可以这样完成: Wait async grunt task to finish