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)
}
}
}
};