Как я могу делиться данными между частями между двумя файлами в Node?

Я хотел бы иметь модуль для Node.js, который представляет собой каталог с несколькими файлами. Я хотел бы, чтобы некоторые vars из одного файла были доступны из другого файла, но не из файлов, внешних по отношению к модулю. Возможно ли это?

Итак, предположим, что следующая файловая структура

` module/
  | index.js
  | extra.js
  ` additional.js

В index.js:

var foo = 'some value';
...
// make additional and extra available for the external code
module.exports.additional = require('./additional.js');
module.exports.extra = require('./extra.js');

В extra.js:

// some magic here
var bar = foo; // where foo is foo from index.js

В additional.js:

// some magic here
var qux = foo; // here foo is foo from index.js as well

Дополнительно и дополнительные реализуют некоторую бизнес-логику (независимую от друг друга), но ей необходимо предоставить некоторые внутренние данные службы, которые не должны экспортироваться.

Единственное решение, которое я вижу, - это создать еще один файл service.js и require из обоих additional.js и extra.js. Правильно ли это? Есть ли другие решения?

Ответ 1

Можете ли вы просто передать нужный материал?

//index.js:
var foo = 'some value';
module.exports.additional = require('./additional.js')(foo);
module.exports.extra = require('./extra.js')(foo);

//extra.js:
module.exports = function(foo){
  var extra = {};
  // some magic here
  var bar = foo; // where foo is foo from index.js
  extra.baz = function(req, res, next){};
  return extra;
};

//additional.js:
module.exports = function(foo){
  var additonal = {};
  additional.deadbeef = function(req, res, next){
    var qux = foo; // here foo is foo from index.js as well
    res.send(200, qux);
  };
  return additional;
};

Ответ 2

Я хотел бы, чтобы некоторые vars из одного файла были доступны из другого файла, но не из файлов, внешних по отношению к модулю

Да, это возможно. Вы можете загрузить этот другой файл в свой модуль и передать его по привилегированной функции, которая предлагает доступ к определенным переменным из области вашего модуля или просто передать ее самим значениям:

index.js:

var foo = 'some value';
module.exports.additional = require('./additional.js')(foo);
module.exports.extra = require('./extra.js')(foo);

extra.js:

module.exports = function(foo){
  // some magic here
  var bar = foo; // foo is the foo from index.js
  // instead of assigning the magic to exports, return it
};

additional.js:

module.exports = function(foo){
  // some magic here
  var qux = foo; // foo is the foo from index.js again
  // instead of assigning the magic to exports, return it
};

Ответ 3

Хорошо, вы можете сделать это с помощью "глобального" пространства имен:

//index.js
global.foo = "some value";

а затем

//extra.js
var bar = global.foo;