Две переменные ссылаются на один и тот же файл config.js, используя require (Reference Problem) в Node.js - PullRequest
0 голосов
/ 04 октября 2019

Здравствуйте, у меня есть этот сценарий в Node.js

// config.js
module.exports = {
    dataUrlTest: "http://www.google.com",
};

#!/usr/bin/env node
//main.js

var config = require("./config.js");
var editConfigFile = require("./config.js");

console.log();
console.log(config["dataUrlTest"]); // output: http://www.google.com
console.log(editConfigFile["dataUrlTest"]); // output: http://www.google.com

editConfigFile["dataUrlTest"] = "test";

console.log();
console.log(config["dataUrlTest"]); // output: test
console.log(editConfigFile["dataUrlTest"]); // output: test

Когда я запускаю "node main.js", выводвыглядит следующим образом:

http://www.google.com
http://www.google.com

test
test

Насколько я понял из Node.js требуется функция, он передает ссылку на файл, не копируя файл в переменную!

Мой вопросЭто, есть ли способ получить копию файла вместо ссылки на него?

Я хочу изменить editConfigFile как значение, не влияя на переменную конфигурации,

Есть ли такая вещь ?, яисследовали об этом, не нашли решения, какие-либо идеи? я буду благодарен.

1 Ответ

2 голосов
/ 04 октября 2019

Поскольку вы импортируете объект, вы получите ссылку. Функция require в основном импортирует экспортированный объект (который является module.exports).

На объекты всегда ссылаются и не копируют в JavaScript. Это относится не только к узлу, но и к JavaScript в целом. Это означает, что и config, и editConfigFile указывают на один и тот же объект.

Один из способов решения этой проблемы - скопировать объект с помощью Object.assign (). Вот как вы можете создать копию:

var config = Object.assign({}, require("./config.js")); //This line basically copies module.exports into a new empty object and returns that the config variable
var editConfigFile = Object.assign({}, require("./config.js"));

Теперь и config, и editConfigFile являются новыми объектами и не будут ссылаться на старый объект.

...