Javascript 文件名为';除非我删除一个看似不相关的要求,否则我不会导入
给定包含以下内容的文件Javascript 文件名为';除非我删除一个看似不相关的要求,否则我不会导入,javascript,node.js,Javascript,Node.js,给定包含以下内容的文件server.js: 'use strict'; const values = require('../valueData/values'); const insertValue = require('../valueData/insertValue'); insertValue.insertRecord(null, null, null, null, null); 文件values.js 'use strict'; const entity = require
server.js
:
'use strict';
const values = require('../valueData/values');
const insertValue = require('../valueData/insertValue');
insertValue.insertRecord(null, null, null, null, null);
文件values.js
'use strict';
const entity = require('../masterData/entity.js');
console.log('inside values.js');
'use strict';
const cache = require('../components/cache.js');
function insertRecord(id, value, valueTimestamp, geolocation, callback) {
cache.getCached(id, function (error, entity) {
});
}
module.exports = {
insertRecord,
}
'use strict';
const entity = require('../masterData/entity.js');
const customer = require('../masterData/customer.js');
console.log('CUSTOMER');
console.log(customer);
console.log('ENTITY');
console.log(entity);
function getCached(id, callback) {
};
module.exports = {
getCached,
}
文件insertValue.js
'use strict';
const entity = require('../masterData/entity.js');
console.log('inside values.js');
'use strict';
const cache = require('../components/cache.js');
function insertRecord(id, value, valueTimestamp, geolocation, callback) {
cache.getCached(id, function (error, entity) {
});
}
module.exports = {
insertRecord,
}
'use strict';
const entity = require('../masterData/entity.js');
const customer = require('../masterData/customer.js');
console.log('CUSTOMER');
console.log(customer);
console.log('ENTITY');
console.log(entity);
function getCached(id, callback) {
};
module.exports = {
getCached,
}
文件cache.js
'use strict';
const entity = require('../masterData/entity.js');
console.log('inside values.js');
'use strict';
const cache = require('../components/cache.js');
function insertRecord(id, value, valueTimestamp, geolocation, callback) {
cache.getCached(id, function (error, entity) {
});
}
module.exports = {
insertRecord,
}
'use strict';
const entity = require('../masterData/entity.js');
const customer = require('../masterData/customer.js');
console.log('CUSTOMER');
console.log(customer);
console.log('ENTITY');
console.log(entity);
function getCached(id, callback) {
};
module.exports = {
getCached,
}
当我执行此操作时,输出如下:
CUSTOMER
{
getCustomerInfoFromDB: [Function: getCustomerInfoFromDB],
}
ENTITY
{
}
本质上:实体
对象将不包含函数(是的,它们通过模块导出。导出
)
但是,当我在values.js
中对导入进行注释时,我得到了预期的输出:
CUSTOMER
{
getCustomerInfoFromDB: [Function: getCustomerInfoFromDB],
}
ENTITY
{
getEntityByID: [Function: getEntityByID],
}
什么可能导致这种行为?
entity.js
和customer.js
都具有相同的导入。请注意,问题也已“修复”当我在server.js
中对values
导入进行注释时,这几乎不是一个解决方案。这一切似乎都指向了这样一个事实,即values.js
中的导入在某种程度上把事情搞砸了。您没有将entity.js放在这里(我们在一个聊天室中讨论这个问题,您已经链接了它),但您将它链接到了一个聊天室中(除非我被允许,否则我不会把它贴在这里)但它表明你的要求中有一个循环引用
在NodeJS中,循环引用不会导致错误。相反,你会得到一些更微妙的东西。基本上,每当你需要一个包时,它只需要一次,代码只执行一次。这意味着当你有这样的代码时
// alice.js
var bob = require('./bob.js')
bob.say()
module.exports = {
say: function () { console.log('hello bob') }
}
// bob.js
var alice = require('./alice.js')
alice.say()
module.exports = {
say: function () { console.log('hello alice!')
}
这一系列事件即将发生:
Alice将被核心解释器require
d
爱丽丝需要鲍勃
然后鲍勃会要求爱丽丝
Alice已被缓存,但她在设置模块.exports
之前退出。这意味着她的模块.exports
将默认为{}
Bob试图调用Alice的模块.exports.say
,它是未定义的
,并得到一个错误,停止执行
代码中似乎发生了这样的情况:当您需要entity.js
时,需要cache.js
,然后它再次需要entity.js
,并尝试立即使用它的一个函数。由于上面列出的行为,此函数未定义,因此代码错误
但是,在insertValues
中,您不需要entity.js
,而是需要cache.js
。当执行cache.js
时,它需要entity.js
,但entity.js不会立即使用任何cache.js
函数,因此没有错误。entity.js
设置模块.exports
>成功,缓存调用它们没有问题
TLDR:循环引用是邪恶的!仅仅因为Node没有告诉你使用它们并不意味着你应该这样做。将循环行为移动到第三方文件。如果你尝试解决这种行为,这将给你带来未来的麻烦。你没有将entity.js放在这里(我们在聊天室中讨论,你已经链接了它),但你在聊天室中链接了它(除非我被允许,否则我不会在这里发布),但它表明你的网站中有一个循环引用
在NodeJS中,循环引用不会导致错误。相反,你会得到一些更微妙的东西。基本上,每当你需要一个包时,它只需要一次,代码只执行一次。这意味着当你有这样的代码时
// alice.js
var bob = require('./bob.js')
bob.say()
module.exports = {
say: function () { console.log('hello bob') }
}
// bob.js
var alice = require('./alice.js')
alice.say()
module.exports = {
say: function () { console.log('hello alice!')
}
这一系列事件即将发生:
Alice将被核心解释器require
d
爱丽丝需要鲍勃
然后鲍勃会要求爱丽丝
Alice已被缓存,但她在设置模块.exports
之前退出。这意味着她的模块.exports
将默认为{}
Bob试图调用Alice的模块.exports.say
,它是未定义的
,并得到一个错误,停止执行
代码中似乎发生了这样的情况:当您需要entity.js
时,需要cache.js
,然后它再次需要entity.js
,并尝试立即使用它的一个函数。由于上面列出的行为,此函数未定义,因此代码错误
但是,在insertValues
中,您不需要entity.js
,而是需要cache.js
。当执行cache.js
时,它需要entity.js
,但entity.js不会立即使用任何cache.js
函数,因此没有错误。entity.js
设置模块.exports
>成功,缓存调用它们没有问题
TLDR:循环引用是邪恶的!仅仅因为Node没有告诉您使用它们并不意味着您应该这样做。将循环行为移动到第三级文件。如果您尝试解决此行为,这将给您带来未来的麻烦。除非我遗漏了什么,否则const entity
的两个声明冲突,就是您r问题。@EdCottrell它们如何冲突?就我所理解的NodeJS而言,const
会将它们的作用域限制在该文件上,因为所有内容都隐式地封装在文件级的函数中。嗯,我不是节点专家;我在这方面有点新手,所以可能会遗漏一些内容。这就是为什么我不发布答案的原因。但是我的事实上,const
s是全局的,只有模块导出是作用域限制的。您可以尝试将其中一个const
s重命名为测试吗?@EdCottrell:对不起,不,没有区别。const
是块作用域的,所以这是不相关的。var
会有这种行为。除非我遗漏了什么,否则不会const-entity
的两个声明冲突,这就是你的问题。@EdCottrell它们如何冲突?据我所知,NodeJS的const
会将它们的范围限制在该文件上