永远不会调用fs.writeFile回调,对于WritableStream.write等也一样

时间:2015-05-18 15:28:06

标签: node.js callback fs

我正在写一个小文本文件(~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'); }
});

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

类似帖子:fs.writeFile() doesn't return callback

平台> Win8.1 x64

&的NodeJS GT; 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 ) ;

重点是,在主流中,失败功能也不会报告任何问题。函数reportFinished()报告一切正常,没有地方可以抛出任何异常,因为上面的原始代码段(位于另一个模块中并作为writeMyOutputData(core)的一部分调用)永远不会调用回调,因此它不能做任何异常抛出或任何类型的错误处理。

然而,在阅读约瑟夫的评论后,他认为它适用于他,我怀疑标准fs模块和q-io / fs之间可能存在一些干扰

2 个答案:

答案 0 :(得分:5)

好的,经过仔细的发现问题确定后。正如约瑟夫所提到的,根本与 fs.writeFile()无关。

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

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

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

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

答案 1 :(得分:0)

我和fs.stat有类似的问题 问题是我正在编写一个繁琐的任务,而且任务并不知道它是异步的,因此同步代码完成并且在调用fs.stat回调之前就终止了应用程序。

这可能不是你的问题,但可能有助于其他人。

完成一项艰巨的任务可以这样做: Wait async grunt task to finish