【问题标题】:How to avoid global variables in node/express如何避免节点/快递中的全局变量
【发布时间】: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


【解决方案1】:

我猜专业节点开发人员使用打字稿,但肯定不会解决你所有的问题。我认为您的第一步可能必须是切换到另一个 ide 或更好地配置它。因为该错误不应该发生。 NodeJS 将你所有的代码放入底层的函数中,然后运行它,所以不应该有任何全局变量。答案是检查你的 IDE,但不知道你正在使用什么。但是,我确实想指出,我不明白您为什么要在两个文件中创建应用程序。您没有在路由器文件中使用它,如果必须,您应该找到一种传递它的方法。也许通过导出一个接受应用程序并返回路由器的函数。

【讨论】:

    【解决方案2】:

    Router.js 上的代码

    const router = require('express').Router();
    

    只使用这一行,希望这能解决您的问题。

    【讨论】:

      【解决方案3】:

      好吧,事实证明 typescript 特别希望您使用 import 而不是 require,它不像普通的旧 JS 那样识别“require”。因此是全局范围问题。

      我的解决方法:从现在开始使用 import XYZ from "XYZ" 进行导入,不需要。感谢以下所有人!

      【讨论】:

        猜你喜欢
        • 2012-12-19
        • 2010-12-22
        • 2011-03-24
        • 1970-01-01
        • 2019-08-01
        • 2016-03-19
        • 2012-02-02
        • 2015-12-26
        • 1970-01-01
        相关资源
        最近更新 更多