为啥节点 10 强制在 fs.writeFile() 上传递回调?

Posted

技术标签:

【中文标题】为啥节点 10 强制在 fs.writeFile() 上传递回调?【英文标题】:Why node 10 has made it mandatory to pass callback on fs.writeFile()?为什么节点 10 强制在 fs.writeFile() 上传递回调? 【发布时间】:2019-02-22 19:43:07 【问题描述】:

突然,当节点引擎升级到 10.7.0 时,我的应用程序开始出现此错误

TypeError [ERR_INVALID_CALLBACK]: Callback must be a function

使用节点 4.5 的代码:fs.writeFile(target, content);

经过一番调试,我在 node_internal/fs.js 中找到了这个:

function writeFile(path, data, options, callback) 
  callback = maybeCallback(callback || options);
  ...

function maybeCallback(cb) 
  if (typeof cb === 'function')
    return cb;
  throw new ERR_INVALID_CALLBACK();

当然,如果不在这里传递第三/第四个参数,我的代码将会失败。我想知道有什么办法可以缓解这个问题。或者如果不是,那么这种突破性变化背后的动机是什么。毕竟 fs.writeFile() 就是这么一个基本的操作,这样的问题真的是升级的时候很头疼。

【问题讨论】:

最有可能的动机是确保开发人员不会忘记处理错误 【参考方案1】:

Node.js 已记录了此更改的目的:https://github.com/nodejs/node/blob/master/doc/api/deprecations.md#dep0013-fs-asynchronous-function-without-callback

这里还有很多讨论:https://github.com/nodejs/node/pull/12562#issuecomment-300734746

事实上,有些开发者似乎同意你的观点,但已经做出决定,现在需要回调。

本身没有缓解措施;你只需要添加一个回调。即使是空的也可以:

fs.writeFile(target, content, () => );

我知道这可能需要对当前工作的代码进行大量更改,但实际上这可能是您添加错误处理的好机会。

【讨论】:

这让我在升级 gulpfile 时摆脱了困境,该 gulpfile 正在使用在 fs.writeFile 行出错的modernizr 任务。写下那句话是为了以后的搜索,并说声谢谢。

以上是关于为啥节点 10 强制在 fs.writeFile() 上传递回调?的主要内容,如果未能解决你的问题,请参考以下文章

fs.writeFile() 在关闭脚本时写入 [object, object] 而不是实际的对象

async/await 无法与 fs.writeFile 一起正常工作

在 fs.writeFile([option]) 中,“选项参数”通常如何工作?

fs.write 在两个文本文件中使用节点 js

如何使用 fs.writefile 创建 HTML 文件

Node.js - 文件系统 - 在 fs.writeFile() 中使用变量