Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何避免在node/express中使用全局变量_Javascript_Node.js_Typescript_Express - Fatal编程技术网

Javascript 如何避免在node/express中使用全局变量

Javascript 如何避免在node/express中使用全局变量,javascript,node.js,typescript,express,Javascript,Node.js,Typescript,Express,我很难决定在节点中避免全局变量的最佳模式 我有一个文件server.js,它初始化了几个常量变量(这给了它们块范围) js位于根目录级别,我在一个文件夹中定义了一些路由器,以便导入。 这是我的问题 在我第一个创建的路由器文件(so,/Routes/myRouter.js)中,我写的第一件事是: const express = require("express");const app = express(); const router = express.Router() 现

我很难决定在节点中避免全局变量的最佳模式

我有一个文件server.js,它初始化了几个常量变量(这给了它们块范围)

js位于根目录级别,我在一个文件夹中定义了一些路由器,以便导入。 这是我的问题

在我第一个创建的路由器文件(so,/Routes/myRouter.js)中,我写的第一件事是:

const express = require("express");const app = express();
const router = express.Router()
现在,我在我的IDE上得到一个很大的警告,告诉我“嘿!你不能声明一个“express”变量!!它已经在server.js中声明过了。 无法重新声明块作用域变量“express”

因此,myserver.js中的express const变量是全局变量,与myRouter.js文件中的声明冲突

一个简单的解决方案是永远不要使用const来避免全局变量,而是对所有内容都使用var,这样变量就可以保存在创建它们的文件中,但这似乎……像是严重的错误做法和误导

我该怎么做?专业节点开发人员该怎么做?似乎有一个简单的方法可以将以下内容添加到每个.single.file的顶部:

export {}


但同样,这似乎是一个懒惰的、随机的黑客行为,我希望遵循良好的实践,而不是将最终会崩溃的随意修补程序拼凑在一起。

我猜专业节点开发人员使用typescript,但这肯定不会解决所有问题。我认为您的第一步可能是切换到另一个ide或更好地配置它呃。因为那个错误不应该发生。NodeJS把你所有的代码都放进一个函数中,然后运行它,所以不应该有任何全局变量。答案是签出你的IDE,但idk你正在使用什么。但是我想指出的是,我不明白你为什么要在这两个文件中创建应用。你不是usi如果必须的话,你应该找到一种传递它的方法。也许可以通过导出一个函数来获取一个应用程序并返回一个路由器。

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

router.js上的代码

const router = require('express').Router();
只使用这一行,希望这能解决您的问题。

Router.js上的代码

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

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

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


我的修正:从“XYZ”中导入XYZ用于从现在开始的导入,无需任何要求。多亏了下面的一切!

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


我的解决方案:使用“XYZ”导入XYZ“从现在起,对于进口产品,无需任何额外费用。感谢下面的一切

每个模块都有自己的作用域,所以我认为在不同模块的顶层使用相同的变量名不应该是一个问题?可能是您的IDE未配置为了解环境properly@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应该有问题。每个模块都有自己的作用域,所以在不同模块的顶层使用相同的变量名不应该是问题,我认为?可能是您的IDE未配置为了解环境properly@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应该有问题。