【发布时间】:2015-07-30 04:39:29
【问题描述】:
我正在编写一个小文本文件 (~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> x64 0.12.0
附:使用实际写入文件的函数的应用程序是使用回调以“普通 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() 报告一切正常并且没有地方抛出任何异常,因为上面的原始 sn-p 是位于另一个模块中并作为 writeMyOutputData( core ) 的一部分调用的函数,它永远不会调用回调并且因此不可能进行任何异常抛出或任何类型的错误处理。
但是,在阅读 Joseph 的评论后,我怀疑标准 fs 模块和 q-io/fs 之间可能存在一些干扰
【问题讨论】:
-
你关闭文件了吗?
-
什么是
DOS_CRLF,只是一个字符串\r\n?如果我在节点中模拟您的代码,它似乎一切正常。可以问一下你的文件名是什么吗?同样重要的是,我们在谈论什么平台? Linux、Mac 还是 Windows? -
什么节点版本和什么操作系统?
-
对不起,我复制了代码并忘记了一些事情:平台是Win 8.1-x64,nodejs是x64 0.12.0,DOS_CRLF = '\r\n';文件名类似于“C:\\DATA\\out\\cv1076_ScanInfo.csv”,要写入的文本是一个字符串(getScanInfo() 返回数组,并且在两个 sn-ps 中通过 join( DOS_CRLF))。我在开发过程中在 Windows 中运行它,生产目标将是 Linux。
-
我同意干扰发生在函数被调用之前的某个地方。你能调试一下吗,因为我认为它可能根本不会出现在
writeFile。