what does fileURLToPath(import.meta.url) do?



好吧,所以我在学习mern堆栈教程,导师写了几行代码,但没有很好地解释。这是代码:

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")));

现在我不是一个愚蠢或糟糕的程序员。尽管我真的没有解释代码在做什么,但我有一个很好的想法。问题是,当我运行我的数据库时,我会得到这个错误:

SyntaxError: Identifier '__filename' has already been declared

这太疯狂了,因为我在代码中的其他地方都没有使用过'__filename]。当我试图将'__filename]更改为'filename]时,我会收到以下错误:

SyntaxError: Cannot use 'import.meta' outside a module

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

__filename基本上指向您正在编写代码的当前文件,而__dirname则为您提供当前文件的父文件夹,例如:

//example.js
const path = require('path');
const {fileUrlToPath} from url
const __filename = fileUrlToPath(import.meta.url);
const __dirname = path.dirname(__filename);
console.log('__filename:', __filename);
//output: /home/users/projects/example.js
console.log('__dirname:', __dirname);
//output /home/users/projects

编写这段代码是浪费时间、空间和精力的,因为Node.js已经在本地为您提供了这些变量。因此,您可以在代码中任意位置编写__dirname__filename,而无需声明它们。他们也有相同的结果

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

在ESM中,只有import.meta.url指向当前文件(如前缀为"file://"的__filename,可以使用fileURLToPath删除)。一旦你有了__filename,你就可以很容易地得到__dirname。

检查您的包.json()是否有

"type":"module"

如果有,则将其删除

最新更新