【问题标题】:fs.writeFile callback never gets called, same for WritableStream.write, etcfs.writeFile 回调永远不会被调用,对于 WritableStream.write 等也是如此
【发布时间】: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

标签: node.js callback fs


【解决方案1】:

好的,经过仔细调试发现问题。正如约瑟夫所说,与 fs.writeFile() 完全无关。

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

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

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

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

【讨论】:

  • 天哪,谢谢!你节省了很多天的工作。没有调用 fs 回调,而且我不知道为什么要尝试调试节点下一步当我在代码中忘记了一点等待时,我会尝试调试节点源^^
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2013-11-23
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    相关资源
    最近更新 更多