好吧,所以我在学习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"
如果有,则将其删除