Сохраняются значения переменных
Добрый день
Подскажите пожалуйста как можно исправить такое: 1. запускается сервер на node js, делаются пост запросы, выполняется скрипт 2. до выполнения переменная не объявлена, после выполнения скрипта она становится равна допустим: "3,21215;" 3. при следующем запрос переменная будет равна уже: "3,21215; 4,26215;" Просто прибавляются значения Объявлять переменные не вариант = их очень много, и очень долго выбирать нужные. Тоесть нужно чтобы "перезапускался" сервер при каждом запросе, у каждого исполнения скрипта - его значения, без сохранения других предыдущих. Как такое можно реализовать? |
Цитата:
|
Цитата:
максимально подробно объяснить хотел я понимаю что нужно заново "инициализировать"(хрен знает как верно) переменные |
davisaliw,
Состояние и данные приложения обычно хранятся в базе данных. Если уж данных совсем мало, то можно и в обычные файлы записывать. Если у вас сложные данные с зависимостями, то берите реляционную БД (mysql, oracle, postgresql and etc...), если совсем простые, то key-value хранилище. Вы можете вообще "не хранить" переменную непосредственно в nodejs, а всегда ходить в БД, чтобы взять или изменить её значение. Все зависит от решаемой задачи. Вы в своем вопросе не пишите какую именно задачу вы пытаетесь решить, поэтому дать вам правильное решение просто невозможно. |
Цитата:
Я так понимаю проблема в том, что переменная не объявлена "var ..." А просто используется, без объявления Поэтому, если несколько раз использовать скрипт, то она сохраняет все значения которые получила: После первого выполнения скрипта: "3,14124;" После второго "3,14124;4,56123;" После третьего: "3,14124;4,56123;5,151173" и т.д. После перезапуска сервера и первого выполнения: "3,14133;" .... и т.д. И таких переменных более 50 штук. Каждый запрос выполняется отдельно(новые пост запросы); Cуть скрипта в вычислении финальной строки, а из за того что сохраняются значения переменных - она уже неверная после первого выполнения. Мне нужно чтобы каждое выполнения скрипта было как новое, без влияния на него предыдущих. Вот так, например, "объявляется" и переменной присваивается значение ( без var ): check.cn_el = check.cn_el + z; |
А check в вашем коде это синглтон?
Ну пишите тогда внутри функции которая его использует так: check.cn_el = z |
Цитата:
нужно что то глобальное на все код, мб взять всё в функцию |
Пример вашего кода пожалуйста напишите, из ваших постов вообще не понятно что вы имеете ввиду.
|
Цитата:
я ошибся, сказав что она не объявлена - объявлена, но все равно какой то баг; Получается так: К каждому новому запросу, в check.cn_el прибавляется новое значение, но старое при этом не затирается - а нужно только новое(новые если цикл). Старое значение убирается только перезапуском сервера. Я взял check.cn_el как пример. Там много переменных, с которыми происходит тоже самое |
var check = { cn_el: '' }; function hardWork(n /* string */) { check.cn_el = ''; for (var el of n) { check.cn_el += el; } return check.cn_el } console.log(hardWork('234')); // '234' console.log(check) // {cn_el: '234'} console.log(hardWork('345')); // '345' console.log(check) // {cn_el: '345'} console.log(hardWork('456')); // '456' console.log(check) // {cn_el: '456'} |
Цитата:
Ладно, у меня получилось сделать: script.js - главный: var http = require('http'), util = require('util'), url = require('url'), hash = require('./hash'); var server = http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); var Y = { alpha: null, beta: null, gamma: null } hash.test(Y); }); server.listen(8080); hash.js - второй. var t4q ={ 'H5I': 0, 'N40': "", }, cf = { doe_cnt: t4q.H5I, doact: t4q.N40, chknull: function (q) { return (null == q) ? -1 : q; }, getFloatVal: function (Y) { if (cf.chknull(Y) != -1 && !isNaN(Y)) { var b = parseFloat(Y); if (!isNaN(b)) return b.toFixed(2); } return -1; }, cdoa: function (Y) { if (Y) { var v = cf.getFloatVal(Y.alpha), h = cf.getFloatVal(Y.beta), W = cf.getFloatVal(Y.gamma), F = cf.doe_cnt + "," + v + "," + h + "," + W + ";"; cf.doact = cf.doact + F, cf.doe_cnt++; console.log(cf.doact); } } }; function test(testobj){ cf.cdoa(testobj); }; module.exports.test = test; делаем несколько гет запросов: Что должно быть: Повторяю, в скрипте очень много переменных и с каждой работать не вариант. |
окей я сам решил проблему, но если у кого то есть решение получше, прошу поделиться
мое решение - добавить функцию reset и вызывать ее в конце каждого запроса: function reset(){ cf = { doe_cnt: t4q.H5I, doact: t4q.N40, chknull: function (q) { return (null == q) ? -1 : q; }, getFloatVal: function (Y) { if (cf.chknull(Y) != -1 && !isNaN(Y)) { var b = parseFloat(Y); if (!isNaN(b)) return b.toFixed(2); } return -1; }, cdoa: function (Y) { if (Y) { var v = cf.getFloatVal(Y.alpha), h = cf.getFloatVal(Y.beta), W = cf.getFloatVal(Y.gamma), F = cf.doe_cnt + "," + v + "," + h + "," + W + ";"; cf.doact = cf.doact + F, cf.doe_cnt++; console.log(cf.doact); } } } } |
А нет, не решил, такое решение не подходит
При большом количестве запросов просто не поспевает ресетнутся и некоторые скрипты выполняются с дубликацией |
davisaliw,
function cfFactory() { var cf = { doe_cnt: t4q.H5I, doact: t4q.N40, chknull: function (q) { return (null == q) ? -1 : q; }, getFloatVal: function (Y) { if (cf.chknull(Y) != -1 && !isNaN(Y)) { var b = parseFloat(Y); if (!isNaN(b)) return b.toFixed(2); } return -1; }, cdoa: function (Y) { if (Y) { var v = cf.getFloatVal(Y.alpha), h = cf.getFloatVal(Y.beta), W = cf.getFloatVal(Y.gamma), F = cf.doe_cnt + "," + v + "," + h + "," + W + ";"; cf.doact = cf.doact + F, cf.doe_cnt++; console.log(cf.doact); } } } return cf; } Просто не используйте в таких случаях глобальные переменные. Делайте эту переменную в контексте функции, и передавайте её в другую функцию в качестве параметров. Т.е. в вашем случае должно быть так function cfFactory() { var t4q = { 'H5I': 0, 'N40': "", }; var cf = { doe_cnt: t4q.H5I, doact: t4q.N40, chknull: function (q) { return (null == q) ? -1 : q; }, getFloatVal: function (Y) { if (cf.chknull(Y) != -1 && !isNaN(Y)) { var b = parseFloat(Y); if (!isNaN(b)) return b.toFixed(2); } return -1; }, cdoa: function (Y) { if (Y) { var v = cf.getFloatVal(Y.alpha), h = cf.getFloatVal(Y.beta), W = cf.getFloatVal(Y.gamma), F = cf.doe_cnt + "," + v + "," + h + "," + W + ";"; cf.doact = cf.doact + F, cf.doe_cnt++; console.log(cf.doact); } } }; return cf; } function test(testobj) { var cf = cfFactory(); cf.cdoa(testobj); }; module.exports.test = test; Функция cfFactory всегда возвращает "новую" переменную cf, т.е. другой объект. cfFactory() !== cfFactory() // true |
Оно самое! Спасибо, то что искал!
|
Часовой пояс GMT +3, время: 17:10. |