fileURLToPath(import.meta.url) 是做什么的?

ger*_*ard 4 url filenames module dirname mern

好吧,我正在学习 Mern Stack 教程,导师写了一些代码行,但并没有很好地解释它们。这是代码:

const path = require('path')
const {fileURLToPath} = require('url')

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

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

现在我并不愚蠢,也不是一个糟糕的程序员。尽管我并没有真正解释代码的作用,但我有一个很好的主意。问题是当我运行数据库时,出现以下错误:

SyntaxError: Identifier '__filename' has already been declared
Run Code Online (Sandbox Code Playgroud)

这很疯狂,因为我没有在代码中的其他任何地方使用“__filename”。当我尝试将 '__filename' 更改为 'filename' 时,出现此错误:

SyntaxError: Cannot use 'import.meta' outside a module
Run Code Online (Sandbox Code Playgroud)

我很困惑。请有人告诉我代码的作用以及为什么我会收到这些错误以及如何修复这些错误。

Ian*_*ter 6

您所看到的是尝试为 ESM 模块(.mjs 文件扩展名或 ind package.json)创建本机常量__filename__dirname(仅存在于 commonJS 模块中)"type":"module"

在 ESM 中,您只需import.meta.url指向当前文件(例如带有“file://”前缀的 __filename - 可以使用 删除fileURLToPath)。一旦你有了 __filename,你就可以轻松获得 __dirname。