Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Сохраняются значения переменных (https://javascript.ru/forum/node-js-io-js/69604-sokhranyayutsya-znacheniya-peremennykh.html)

davisaliw 05.07.2017 22:42

Сохраняются значения переменных
 
Добрый день
Подскажите пожалуйста как можно исправить такое:
1. запускается сервер на node js, делаются пост запросы, выполняется скрипт
2. до выполнения переменная не объявлена, после выполнения скрипта она становится равна допустим: "3,21215;"
3. при следующем запрос переменная будет равна уже: "3,21215; 4,26215;"
Просто прибавляются значения
Объявлять переменные не вариант = их очень много, и очень долго выбирать нужные.

Тоесть нужно чтобы "перезапускался" сервер при каждом запросе, у каждого исполнения скрипта - его значения, без сохранения других предыдущих.

Как такое можно реализовать?

Rise 05.07.2017 23:49

Цитата:

Сообщение от davisaliw
"перезапускался" сервер при каждом запросе

рукалицо

davisaliw 05.07.2017 23:53

Цитата:

Сообщение от Rise (Сообщение 457684)
рукалицо

оч полезно, спасибо
максимально подробно объяснить хотел

я понимаю что нужно заново "инициализировать"(хрен знает как верно) переменные

EmperioAf 06.07.2017 01:11

davisaliw,
Состояние и данные приложения обычно хранятся в базе данных. Если уж данных совсем мало, то можно и в обычные файлы записывать.
Если у вас сложные данные с зависимостями, то берите реляционную БД (mysql, oracle, postgresql and etc...), если совсем простые, то key-value хранилище.
Вы можете вообще "не хранить" переменную непосредственно в nodejs, а всегда ходить в БД, чтобы взять или изменить её значение.
Все зависит от решаемой задачи. Вы в своем вопросе не пишите какую именно задачу вы пытаетесь решить, поэтому дать вам правильное решение просто невозможно.

davisaliw 06.07.2017 10:43

Цитата:

Сообщение от EmperioAf (Сообщение 457688)
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;

EmperioAf 06.07.2017 11:44

А check в вашем коде это синглтон?
Ну пишите тогда внутри функции которая его использует так:
check.cn_el = z

davisaliw 06.07.2017 11:49

Цитата:

Сообщение от EmperioAf (Сообщение 457718)
А check в вашем коде это синглтон?
Ну пишите тогда внутри функции которая его использует так:
check.cn_el = z

нет, там цикл у некоторых переменных

нужно что то глобальное на все код, мб взять всё в функцию

EmperioAf 06.07.2017 11:52

Пример вашего кода пожалуйста напишите, из ваших постов вообще не понятно что вы имеете ввиду.

davisaliw 06.07.2017 12:47

Цитата:

Сообщение от EmperioAf (Сообщение 457722)
Пример вашего кода пожалуйста напишите, из ваших постов вообще не понятно что вы имеете ввиду.

я бы с радостью, но не получается воспроизвести похожий код;

я ошибся, сказав что она не объявлена - объявлена, но все равно какой то баг;

Получается так:

К каждому новому запросу, в check.cn_el прибавляется новое значение, но старое при этом не затирается - а нужно только новое(новые если цикл).

Старое значение убирается только перезапуском сервера.

Я взял check.cn_el как пример. Там много переменных, с которыми происходит тоже самое

EmperioAf 06.07.2017 13:26

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'}

davisaliw 06.07.2017 15:05

Цитата:

Сообщение от EmperioAf (Сообщение 457745)
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;


делаем несколько гет запросов:


Что должно быть:


Повторяю, в скрипте очень много переменных и с каждой работать не вариант.

davisaliw 06.07.2017 16:14

окей я сам решил проблему, но если у кого то есть решение получше, прошу поделиться

мое решение - добавить функцию 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 06.07.2017 20:39

А нет, не решил, такое решение не подходит
При большом количестве запросов просто не поспевает ресетнутся и некоторые скрипты выполняются с дубликацией

EmperioAf 06.07.2017 21:37

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

davisaliw 06.07.2017 23:48

Оно самое! Спасибо, то что искал!


Часовой пояс GMT +3, время: 17:10.