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
    会将它们的范围限制在该文件上