好吧,我正在学习 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")));
现在我并不愚蠢,也不是一个糟糕的程序员。尽管我并没有真正解释代码的作用,但我有一个很好的主意。问题是,当我运行数据库时,我收到此错误:
SyntaxError: Identifier '__filename' has already been declared
这很疯狂,因为我没有在代码中的其他任何地方使用“__filename”。当我尝试将 '__filename' 更改为 'filename' 时,我收到此错误:
SyntaxError: Cannot use 'import.meta' outside a module
我很困惑。请有人告诉我代码的作用以及为什么我会收到这些错误以及如何修复这些错误。
检查你的 package.json() 是否有
"type":"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 文件扩展名或
__filename
ind package.json)创建本机常量 __dirname
和 "type":"module"
(仅存在于 commonJS 模块中)。
在 ESM 中,您只有
import.meta.url
指向当前文件(例如带有“file://”前缀的 __filename - 可以使用 fileURLToPath
删除)。一旦你有了 __filename,你就可以轻松获得 __dirname。