__dirname 未在 Node 14 版本中定义

Edu*_*ard 11 javascript node.js

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

__dirname is not defined
Run Code Online (Sandbox Code Playgroud)

__dirname 是 Node 中的核心变量,据我所知,它是否在 Node 14 中删除了?

adl*_*z15 25

你是如何加载文件的?根据这个问题,如果您将其加载为不包含 __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);
Run Code Online (Sandbox Code Playgroud)

  • 我得到“目录名未定义”,所以最后一行我必须更改为 `const __dirname = path.dirname(__filename);` (2认同)

小智 17

我之前的代码如下所示。

app.use(express.static(path.join(__dirname, 'public')));
Run Code Online (Sandbox Code Playgroud)

我得到了这个错误。

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

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

import path from 'path';
const __dirname = path.resolve();
Run Code Online (Sandbox Code Playgroud)

  • 这只解决节点进程的 cwd,因此例如“node myscript.mjs”将起作用,但“node dir/myscript.mjs”将不起作用。 (30认同)

Chr*_*isV 7

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

例如(使用 ESM)

fs.readFileSync(new URL('myfile.txt', import.meta.url));
Run Code Online (Sandbox Code Playgroud)

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

  • 好吧,看来我只需要更新一下我的想法了。path.resolve() 只返回 cwd。其他方法就比较啰嗦了。URL 概念已融入 ES6 模块中。看来这是现在的标准方法/sf/answers/4665578431/。感谢您的回答! (2认同)
  • 这将返回一个“Buffer”,如果您想要一个字符串,请使用:“fs.readFileSync(new URL('myfile.txt', import.meta.url), 'utf-8');” (2认同)

PUG*_*SAN 6

从上面的链接得到这个

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

const app = express();

//we need to change up how __dirname is used for ES6 purposes
const __dirname = path.dirname(fileURLToPath(import.meta.url));
//now please load my static html and css files for my express app, from my /dist directory
app.use(express.static(path.join(__dirname ,'dist')));

//works...
Run Code Online (Sandbox Code Playgroud)