【发布时间】:2021-03-24 03:06:43
【问题描述】:
我很难确定在节点中避免全局变量的最佳模式是什么。
我有一个 server.js 文件,它初始化了一些 Const 变量(赋予它们块范围)
const express = require("express");
const path = require("path");
const bodyParser = require("body-parser");
const app = express();
const port = process.env.PORT || 3000;
server.js 位于根目录级别,我在文件夹中定义了一些路由器以供导入。 这是我的问题。
在我创建的第一个路由器文件(即 /Routes/myRouter.js)中,我写的第一件事是:
const express = require("express");const app = express();
const router = express.Router()
现在,我在 IDE 上收到一个大警告,告诉我“嘿!你不能声明一个“express”变量!它已经在 server.js 中声明了。 无法重新声明块范围变量“express”。
因此,我的 server.js 中的 express const 变量是全局的,并且与我的 myRouter.js 文件中的此声明发生冲突。
一个简单的解决方案是永远不要使用 const 以避免全局变量,而是将 var 用于所有内容,因此变量在创建它们的文件中保留自己,但这似乎...... . 喜欢严重的错误做法和误导。
我该怎么办?专业的节点开发人员是做什么的?似乎有一个简单的解决方法,将以下内容添加到每个的顶部。单身的。文件:
export {}
但同样,这似乎只是一种懒惰、随意的 hack,我想遵循良好的做法,而不是将最终破坏道路的随意修复粘贴在一起。
【问题讨论】:
-
每个模块都有自己的范围,所以在不同模块的顶层使用相同的变量名不应该是个问题,我想?可能是您的 IDE 未配置为正确理解环境
-
@CertainPerformance 对作用域变量是正确的。可能是您的 IDE 给您错误。对我来说,我有一个 variables.js 文件,其中包含我的 .env var 和 const,然后我有一个配置文件来创建 express 和其他需要的东西,并且 obv 它正在导出这些,而在 server.js 中我只需要需要什么和在路线内部和任何地方我都只是从 config.js 导入它:)
-
const 并不比 var 更全球化。如果有的话,块范围(即 const 使用)比词法范围(即 var 使用)更具限制性。你确定你没有在同一个文件中两次声明 express 吗? (你没有两个
const/let/var express) -
如果您使用的是 VS 代码,请尝试删除所有与 js 相关的插件,因为我总是在路由器和服务器文件中使用
const和相同的变量名。您的 IDE 应该有问题。
标签: javascript node.js typescript express