【问题标题】:__dirname is not defined in Node 14 version__dirname 未在 Node 14 版本中定义
【发布时间】:2021-01-30 15:59:04
【问题描述】:

我一直在使用 Node 版本 12.3.4 将其更新到 14.14.0 并开始收到很多我修复的问题。我唯一不明白的是问题

__dirname is not defined

__dirname 是我知道的 Node 中的核心变量,它在 Node 14 中被删除了吗?

【问题讨论】:

  • 这是在 MJS 还是 CJS 中?在 MJS 模式下,您需要 a shim,因为它与 import 的工作方式不同。

标签: javascript node.js


【解决方案1】:

你是如何加载文件的?根据这个问题,如果您将其加载为不包含 __dirname 的 ECMAScript 模块,则会出现问题。

https://github.com/nodejs/help/issues/2907#issuecomment-671782092

按照以下文档,您或许能够解决该问题: https://nodejs.org/api/esm.html#esm_no_require_exports_module_exports_filename_dirname

import { fileURLToPath } from 'url';
import { dirname } from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

【讨论】:

  • 太棒了!它有效,明白了。
  • 很好的答案。像魅力一样工作。
【解决方案2】:

通常不需要从 'url' 或 'path' 导入。

例如(使用 ESM)

fs.readFileSync(new URL('myfile.txt', import.meta.url));

将从 JavaScript 文件的目录(不是从当前工作目录)读取 myfile.txt。

【讨论】:

  • 很酷的解决方案,但对于那些不知情和/或不在使用 URL 似乎有点不合适的浏览器上下文中工作的人来说,感觉不是很清楚。也许您可以详细说明这可能在什么时候特别合适?
  • 好吧,看来我只需要更新一下思路。 path.resolve() 只返回 cwd。其他方法很啰嗦。 URL 概念被嵌入到 ES6 模块中。这似乎是现在stackoverflow.com/a/66651120/4682556 的标准方法。感谢您的回答!
  • 这会返回一个Buffer,如果你想要一个字符串使用:fs.readFileSync(new URL('myfile.txt', import.meta.url), 'utf-8');
  • 这太棒了,谢谢!没有额外的要求,没有黑客,未来的证明。
【解决方案3】:

我之前的代码如下。

app.use(express.static(path.join(__dirname, 'public')));

我得到了这个错误。

ReferenceError: __dirname 未在 ES 模块范围内定义

我通过在下面添加代码解决了这个问题。

import path from 'path';
const __dirname = path.resolve();

【讨论】:

  • 这只解析节点进程的cwd,例如node myscript.mjs 可以,但node dir/myscript.mjs 不行。
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2022-01-23
  • 2020-12-16
  • 2021-08-29
  • 2021-08-03
  • 2016-09-28
相关资源
最近更新 更多