Node.js 了解NodeJS中require的行为

Node.js 了解NodeJS中require的行为,node.js,Node.js,我在Node项目中有两个javascript文件。 一种是路由器,它有路由和相应的功能。 另一个是实用类,其中常用的函数被编写为原型。说utilservice.getSomething() 第一个文件在第二个文件中调用utilservice.getSomething() 我在第二个文件中导入了第一个文件(这是不必要和未使用的),然后在第一个文件中调用了一个API 我在声明utilservice.getSomething()不是函数时遇到错误500 我花了这么多时间思考Promise的使用出现了问

我在Node项目中有两个javascript文件。 一种是路由器,它有路由和相应的功能。 另一个是实用类,其中常用的函数被编写为原型。说utilservice.getSomething()

第一个文件在第二个文件中调用utilservice.getSomething()

我在第二个文件中导入了第一个文件(这是不必要和未使用的),然后在第一个文件中调用了一个API

我在声明utilservice.getSomething()不是函数时遇到错误500

我花了这么多时间思考Promise的使用出现了问题,尝试了async和Wait,结果还是出现了同样的错误

最后,我删除了导入,发现API调用进行得很好

我的印象是,需要的只是在另一个脚本中导入方法。但还有一些事情要做。网上有一些资源可以说明请求的目的。但我喜欢理解这种行为

样本:

File1.js

const utilService = require('../utils/utilService');

router.get('/something',function(req,res){
  utilService.getSomething().then((data)=>{
       //do something
 })
});
File2.js

const file = require('../file1');

function util(){}
util.prototype.getSomething = function(){
  return "hello"
}
module.exports = new util();

我击中了那个/什么东西。我得到了utilservice.getSomething不是函数。

在nodeJS中,require允许您从其他文件导入模块。 它可以帮助您拆分应用程序并只加载执行它们所需的文件,而不是免费加载一堆未使用的代码

它实际上以不同的名称存在于许多其他语言中:require(php)、include(php)、import(typescript、python……等等)

还有一件事:为了能够正确地使用require,您必须“导出”模块、定义、函数、类等,以便能够使用“module.exports”或“exports”在另一个脚本中使用它们。因此,基本上它与“上下文”有关,或者如果你更喜欢“范围”

这就是为什么在使用package.json进行“npm安装”时会有一个名为“node_modules”的文件夹


由于“require”,每次在应用程序上执行操作时,您只能导入必要的内容,而不能导入整个项目文件。

虽然
require
通常用于导入其他模块和脚本,但它也会执行这些模块中的任何代码。这允许模块覆盖其他模块和对象原型的属性。模块不要求
module.exports
有效才能导入

例:

File1.js

const utilService = require('../utils/utilService');

router.get('/something',function(req,res){
  utilService.getSomething().then((data)=>{
       //do something
 })
});
module.exports={
傅:()=>{
console.log(“你好”);
}
};
File2.js

const file = require('../file1');

function util(){}
util.prototype.getSomething = function(){
  return "hello"
}
module.exports = new util();
const mod=require(“./File1.js”);
删除mod.foo;
index.js

const mod=require(“./File1.js”);
mod.foo();//你好
需要(“./File2.js”);//未定义
mod.foo();//mod.foo不是一个函数

恭喜你,你已经来到了人类的世界。我不只是告诉你那是什么,而是给你举个例子

假设您有两个文件,
file1.js
file2.js

file1.js

module.exports={
doSomething:function(){
log(“做了某事”);
}
};
file2.js

const util=require(“./file1”);
util.doSomething();
file1.js
导出了一个名为
doSomething
的函数,然后
file2.js
调用了它。因此,当前的依赖关系树如下所示:

file2.js -> requires -> file1.js
现在,当您将
file1.js
修改为以下内容时,就会出现问题:

constfile2=require(“./file2”);
module.exports={
doSomething:function(){
log(“做了某事”);
}
};
为什么??好了,现在让我们看看依赖关系树

file2.js -> requires -> file1.js -> requires -> file2.js -> requires -> file1.js

看到问题了吗
file2.js
需要
file1.js
,需要
file2.js
,但是
file2.js
需要
file1.js
(等等)。Node.JS没有陷入无限循环,而是从
file1.JS
加载
module.exports
的当前状态(这是未定义的,因为脚本在
require(“./file2”)
)上卡住了),这就是如何得到
类型错误的原因,我导出了文件2中的方法。甚至我所知道的thag所需要的是从其他模块导入代码,这样我们就可以组织代码,而不是只把一个文件搞砸。我想知道的是,为什么不需要的导入(甚至没有在made code break中使用)会导致代码中断。考虑到你的文件2.js,至少你对文件1导入做了一些事情。我什么也没做。那个进口货完全没用。哦,不!我没想过。这是合理的。节点终端可能在服务器启动时引发了一个错误,指出导入存在这样的问题,就像在任何请求中存在错误的目录结构或缺少任何请求时一样。vscode中是否有任何库会在启动前引发此类错误?这会有帮助的。因为,我的印象是,无论如何,它没有被使用,所以它不会做任何事情。我只是发现:它可能会有帮助。仍在思考节点服务器最初是如何启动的。服务器启动是因为服务器启动时您没有调用该函数。由于JavaScript在您尝试引用不存在的对象属性时不会抛出错误,因此程序可以正常启动。