除非我删除看似不相关的要求,否则不会导入文件

File isn't imported unless I remove a seemingly irrelevant require

本文关键字:文件 导入 删除 非我 不相关      更新时间:2023-09-26

给定文件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');

文件insertValue.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,
}

文件cache.js

'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
{ 
}

本质上:entity对象将不包含任何函数(是的,它们是通过modules.export导出的。

但是,当我在 values.js 中评论导入时,我得到了预期的输出:

CUSTOMER
{ 
  getCustomerInfoFromDB: [Function: getCustomerInfoFromDB],
}
ENTITY
{ 
  getEntityByID: [Function: getEntityByID],
}

什么可能导致这种行为? entity.jscustomer.js都具有相同的导入。请注意,当我在server.js中评论values导入时,问题也已"修复",但这几乎不是解决方案。这一切似乎都表明,values.js的进口以某种方式搞砸了事情。

你还没有把实体.js放在这里(我们在聊天室里谈论这个你已经链接了它(,但你在聊天室中链接了它(除非我被允许,否则我不会在这里发布它(,但它表明你的要求中有一个循环引用。

在 NodeJS 中,循环引用不会导致错误。相反,你会得到一些更微妙的东西。基本上,每当您require包时,只需要一次,代码只执行一次。这意味着当你有这样的代码时...

// 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!')
}

这一系列事件将要发生:

  1. 爱丽丝将由核心解释器require
  2. 爱丽丝需要鲍勃。
  3. 然后鲍勃将需要爱丽丝。
  4. 爱丽丝已经被缓存了,但她在设置module.exports之前退出了。这意味着她的module.exports将默认为{}
  5. 鲍勃试图调用爱丽丝undefined module.exports.say,并得到一个错误,停止执行。

这似乎是您的代码中正在发生的事情:当您需要entity.js时,这需要cache.js,然后再次需要entity.js并尝试立即使用它的函数之一。由于我上面列出的行为以及代码错误,undefined此函数。

但是,在 insertValues 中,您不需要entity.js而是cache.js 。当cache.js执行时,它需要entity.js,但 entity.js 不会立即使用cache.js任何 ' 函数,因此没有错误。 entity.js成功设置module.exports并且缓存调用它们没有问题。

TLDR:循环引用是邪恶的!仅仅因为 Node 没有告诉你使用它们并不意味着你应该这样做。将循环行为移动到第三文件。如果您尝试解决这种行为,它将使您将来头疼。