Javascript require和module.exports:TypeError:X不是函数 文件结构:

Javascript require和module.exports:TypeError:X不是函数 文件结构:,javascript,node.js,export,require,Javascript,Node.js,Export,Require,在mainController中,我有一个函数isValid来检查字符串,我把它放在那里是因为我想从usiliateurscontroller.js和locationscoontroller.js访问它。我将其导出如下: mainController.js const lc=require('./locationsController'); const uc=需要('./使用控制器'); // ... module.exports={ //关联所有模型 associateAll:函数(){ 立法

mainController
中,我有一个函数
isValid
来检查字符串,我把它放在那里是因为我想从
usiliateurscontroller.js
locationscoontroller.js
访问它。我将其导出如下:

mainController.js
const lc=require('./locationsController');
const uc=需要('./使用控制器');
// ...
module.exports={
//关联所有模型
associateAll:函数(){
立法会:联系职位();;
uc.AssociateUtilitisaters();
},
isValid:函数(…字段){
for(设i=0;i
问题 我可以从
usilizateUrsController.js
访问函数
isValid
,但当我尝试从
locationsController.js
执行相同操作时,出现以下错误:

(node:6461) UnhandledPromiseRejectionWarning: TypeError: mc.isValid is not a function
    at exports.getAllTasks (.../server/controllers/locationsController.js:30:11)
代码
utilizateUrsController.js
从这个文件中,我可以完全访问
isValid
,没有错误

const mc=require('./mainController');
// ...
exports.login=异步函数(req、res){
让响应={
// ...
}
if(req.query==null){
response.infoMsg='queryempty…';
res.send(响应);
返回;
}
const usernameInput=req.query.username;
const passwordInput=req.query.password;
如果(!mc.isValid(usernameInput,passwordInput)){
response.infoMsg='用户名或密码为空…'
res.send(响应);
返回;
}
// ...
}
locationsController.js
从这个文件中,我得到了上面提到的错误,我真的不知道为什么

const mc=require('./mainController');
// ...
exports.getAllTasks=异步函数(req,res){
让响应={
// ...
}
const usernameInput=req.params.username;
如果(!mc.isValid(usernameInput)){
response.infoMsg='未提供任何参数…';
res.send(响应);
返回;
}
// ...
}
我怎么想 我想这可能是因为决议的顺序

调试器所说的
utilizateUrsController.js

locationsController.js


我真的不知道是什么导致了这个问题…

这个问题是由于您在
主控制器
使用URSController
位置控制器
之间存在循环关系造成的。
utilizateUrsController
locationsController
都需要
mainController
mainController
都需要
utilizateUrsController
locationsController
。因此,Node.js的CommonJS样式的模块解析最终会在至少一个(可能两个)模块中运行顶级代码,并为其他模块之一的导出使用占位符对象。(显然,在您的情况下,
locationsController
会为
mainController
的导出获取占位符。
UsilizateUrsController
可能也会,但不会尝试在顶层使用它。)

如果您避免在顶层使用
mc
,而只在稍后调用的函数中使用它,那么占位符将在您需要它之前被填充,一切都会很好。您引用的代码似乎只在函数中使用了
mc
,但考虑到您所得到的错误,很明显,您的真实代码并非如此

更多信息请访问



旁注:本机JavaScript模块不会出现这种情况(通常称为“ESM”,表示“ECMASscriptModules”),因为即使存在循环依赖项,它们也会在顶层模块代码运行之前得到解决。

请阅读帮助部分。完成创建最小但完整的示例的过程是调试的重要部分,并且(如果您没有弄清楚),问一个问题。谢谢!我将
isValid
放在帮助文件中以避免循环relationships@davalres-听起来很完美,不错!:-)另一个问题,如果我用
return!!fields[I]
替换我的
isValid
函数中的条件,它会有完全相同的效果吗?我正在探索JS中的truthy/falsy概念(因为
未定义
'
的真实值都是
,对吗?)@DavidAlvarez-不,这会有两个不同的原因:1.您只返回第一个字段的标志,因为
return
终止函数。2.有几个值不在您的列表中,它们是错误的,例如
0
NaN
。您最初专门检查了三个错误值(
undefined
null
),但是完整的列表是
undefined
null
0
NaN
,当然还有
false
(所有其他值都是真实的。)感谢您帮助我理解这个概念!
(node:6461) UnhandledPromiseRejectionWarning: TypeError: mc.isValid is not a function
    at exports.getAllTasks (.../server/controllers/locationsController.js:30:11)