我正在写一个小文本文件(~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之间可能存在一些干扰
答案 0 :(得分:5)
在我的应用程序中,实际上有两个文件写入运行"同时"。在我的问题中列出的那个和另一个,在计算一些平均值时逐步写入数据。
另一个逐步写入函数有一个错误(拼写错误的变量名称),导致在操作过程中(在连续写入之间)抛出引用错误。由于某些原因我不太了解这个例外,并没有出现在链中的任何地方。根据Q文档,Promise.done()应抛出任何未处理的异常,但事实并非如此。
在promise链中添加了几个fail()处理程序后,我能够找到错误并实现整个应用程序的合理行为。
因此错误与错误的编程风格(不正确处理异常)而不是fs模块有关。但是,我无法相信可能会出现未处理的异常,这些异常可能会丢失并且永远不会出现在白天。另外,我很难相信异步操作 B 中的异常会影响另一个非相关的异步操作 A 。
答案 1 :(得分:0)
我和fs.stat有类似的问题 问题是我正在编写一个繁琐的任务,而且任务并不知道它是异步的,因此同步代码完成并且在调用fs.stat回调之前就终止了应用程序。
这可能不是你的问题,但可能有助于其他人。
完成一项艰巨的任务可以这样做: Wait async grunt task to finish