除非我删除看似不相关的要求,否则不会导入文件
File isn't imported unless I remove a seemingly irrelevant 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');
文件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.js
和customer.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!')
}
这一系列事件将要发生:
- 爱丽丝将由核心解释器
require
。 - 爱丽丝需要鲍勃。
- 然后鲍勃将需要爱丽丝。
- 爱丽丝已经被缓存了,但她在设置
module.exports
之前退出了。这意味着她的module.exports
将默认为{}
。 - 鲍勃试图调用爱丽丝
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 没有告诉你使用它们并不意味着你应该这样做。将循环行为移动到第三文件。如果您尝试解决这种行为,它将使您将来头疼。
- 将数据从javascript文件导入VB.Net页面
- 将xml文件导入pdf(Acrobat)
- 如何从typescript文件导入javascript文件
- 在不干扰HTML代码的情况下,将javascript文件导入javascript文件
- 将Javascript文件导入REPL会话
- NodeJS-从其他文件导入函数,并像以前一样使用
- 有没有一种简单的方法可以通过javascript将MySQL文件导入SQLite数据库
- 如何从外部文件导入 JavaScript
- 将JSON文件导入到Grunt服务器上运行的Angular应用程序中
- 将 Excel 文件导入和导出到 JavaScript 数组
- 从外部 JS 文件导入变量值
- JSON+Javascript/jQuery.如何从 json 文件导入数据并对其进行解析
- 如何从某个外部文件导入nodejs中的模块
- 如何将Javascript文件导入Typescript
- 将 Amazon S3 文件导入数据库
- 如何将excel文件导入Web应用程序(javascript/d3/html)
- 从数据文件导入数组
- 使用 javascript 将数据从文本文件导入数组
- 将一个Javascript文件导入另一个Javascript文件
- 如何将数据从php文件导入javascript变量