module.export и глобальные объекты

Я не совсем понимаю.

Иногда, когда мой веб-API получает данные, он смешивает данные между объектами, и мне кажется, что глобальный объект в файле на самом деле является постоянным.

Вот основная схема кода

handlers.js

const something = require('./otherfile')
let handlers ={}

handlers.customers = function (data, callback) {
  let acceptableMethods = ['post'];
  if (acceptableMethods.indexOf(data.method) > -1) {
    handlers._customers[data.method](data, callback);
  } else {  
    callback(405); 
  }
};

handlers._customers = {}

handlers._customers.post = async function (data, callback) {
  customer.new(data);
  callback(200, 'success')
}

otherfile.js

let contacts_list = [];
let accountData = {};

module.exports = something = {
  new: {
      dostuff: async function (data) {
      // update and reference global objects here..
      accountData.name = data.name;
      accountData.otherProperty = await somefunction(data.prop)
    }
  }
}

Я ожидал, что, поскольку он требует экспортируемого модуля, каждый раз, когда он будет вызывать экспортируемый модуль, он будет рассматриваться как его собственный объект, однако, кажется, что объект не обрабатывается как уникальный и вместо этого перезаписывается частично и ' случайным образом'. Это говорит мне о том, что я могу экспортировать мутирующий объект, такой как массив, между файлами

Правильно ли я в том, что глобальный сохраняется через несколько запросов? Повлияет ли установка глобала в объекте экспорта на поведение этого объекта каким-либо образом? В этом случае я не хочу, чтобы эти данные мутировали.

Заранее спасибо за вашу конструктивную критику и руководство:)

1 ответ

Решение

[Перестройте ваш код, чтобы вы создавали новый объект при каждом запросе. Модули кэшируются по первому требованию, поэтому все ваши переменные и свойства объекта будут сохраняться при вызовах.

// handler.js



const somethingFactory = require('./otherfile')

module.exports = function(){
  let handlers = {}
  const something = somethingFactory();

  handlers.customers = function (data, callback) {
    let acceptableMethods = ['post'];
    if (acceptableMethods.indexOf(data.method) > -1) {
      handlers._customers[data.method](data, callback);
    } else {  
      callback(405); 
    }
  };

  handlers._customers = {}

  handlers._customers.post = async function (data, callback) {
    customer.new(data);
    callback(200, 'success')
  }

  return handlers;

};

otherfile.js

module.exports = function(){
  let contacts_list = [];
  let accountData = {};

  return {
     new: {
      dostuff: async function (data) {
      // update and reference global objects here..
      accountData.name = data.name;
      accountData.otherProperty = await somefunction(data.prop)
     }
    }
  }

};

Другие вопросы по тегам