Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Проблемка с видимостью (https://javascript.ru/forum/node-js-io-js/66628-problemka-s-vidimostyu.html)

CrazyBite 28.12.2016 11:15

Проблемка с видимостью
 
Всем привет. Столкнулся с проблемой:
Есть функция которая принимает данные для вставки в SQL.
Обработка ошибки SQL результата проходит в под функции. Как сделать что бы при ошибке производился выход из основной функции? строка 20.
Пробовал через переменную заданную в теле основной функции, в теле под функции она не меняется.
И бесит то что 28 строка первее выполняется чем 19, как с этим бороться?
mysql библиотека это npm mysql.

function add_data(ws,id,data){
	
	if (typeof data == "undefined"){
		ws.send(JSON.stringify({"id":id,"status":"error","reason":"bad data"}));
		return;
	}	
	for (var i=0;i<data.length;i++){
		var rows = ['req_num', 'req_date', 'exec_date', 'exec_fio', 'exec_org', 'skuname', 'apparea', 'confchange', 'paramdescr', 'devices', 'attach', 'org', 'post', 'fio', 'org1', 'post1', 'fio1', 'org2', 'post2', 'fio2', 'org3', 'post3', 'fio3', 'change1', 'fio_ptk1', 'change2', 'fio_ptk2', 'change3', 'fio_ptk3', 'change4', 'fio_ptk4', 'change5', 'fio_ptk5', 'change6', 'fio_ptk6'];
		for (var j=0;j<rows.length; j++){			
			if (typeof data[i][rows[j]] == undefined){
				ws.send(JSON.stringify({"id":id,"status":"error","reason":"bad keys"}));
				return false;
			}
		}
		var post = {'req_num':data[i]['req_num'], 'req_date':data[i]['req_date'], 'exec_date':data[i]['exec_date'], 'exec_fio':data[i]['exec_fio'], 'exec_org':data[i]['exec_org'], 'skuname':data[i]['skuname'], 'apparea':data[i]['apparea'], 'confchange':data[i]['confchange'], 'paramdescr':data[i]['paramdescr'], 'devices':data[i]['devices'], 'attach':data[i]['attach'], 'org':data[i]['org'], 'post':data[i]['post'], 'fio':data[i]['fio'], 'org1':data[i]['org1'], 'post1':data[i]['post1'], 'fio1':data[i]['fio1'], 'org2':data[i]['org2'], 'post2':data[i]['post2'], 'fio2':data[i]['fio2'], 'org3':data[i]['org3'], 'post3':data[i]['post3'], 'fio3':data[i]['fio3'], 'change1':data[i]['change1'], 'fio_ptk1':data[i]['fio_ptk1'], 'change2':data[i]['change2'], 'fio_ptk2':data[i]['fio_ptk2'], 'change3':data[i]['change3'], 'fio_ptk3':data[i]['fio_ptk3'], 'change4':data[i]['change4'], 'fio_ptk4':data[i]['fio_ptk4'], 'change5':data[i]['change5'], 'fio_ptk5':data[i]['fio_ptk5'], 'change6':data[i]['change6'], 'fio_ptk6':data[i]['fio_ptk6'], 'sync':0};
		var err = false;
		var query = connection.query("INSERT INTO  `db_requests` SET ?",post, function(err, result) {
			if (err){
				ws.send(JSON.stringify({"id":id,"status":"error","reason":err.code}));
				return; // Как вот тут выйти из функции?
			}
		});		
				
		console.log(err);

	}

	ws.send(JSON.stringify({"id":id,"status":"ok","data":"done"}));
}

Coriolan161 28.12.2016 12:49

CrazyBite,
Цитата:

в теле под функции она не меняется
ты в том коллбеке своему err присвой true и после 23 строки проверь
if (err) return;


Цитата:

бесит то что 28 строка первее выполняется чем 19, как с этим бороться?
Цепочкой сделай чисто на посмотреть

CrazyBite 28.12.2016 13:43

Цитата:

Сообщение от Coriolan161 (Сообщение 439148)
ты в том коллбеке своему err присвой true и после 23 строки проверь

Пробовал - не получается:
var error = false;
		var query = connection.query("(ERROR)INSERT INTO  `db_requests` SET ?",post, function(err, result) {
			if (err){
				error = true;
				console.log("inside:"+error);
				ws.send(JSON.stringify({"id":id,"status":"error","reason":err.code}));
				return;
			}
		});		
				
		console.log("outside:"+error);

Вывод:
[nodemon] starting `node server.js`
outside:false
inside:true

Про цепочку не понял.

Coriolan161 28.12.2016 14:04

CrazyBite,
Цитата:

Пробовал - не получается:
Да. не получится. там же асинхронный запрос и код идет дальше.

CrazyBite 28.12.2016 14:08

Цитата:

Сообщение от Coriolan161 (Сообщение 439172)
CrazyBite,
Да. не получится. там же асинхронный запрос и код идет дальше.

Что можно придумать в этом случае?

Coriolan161 28.12.2016 14:11

CrazyBite,
Цитата:

Про цепочку не понял
Короче просто проверь в коллбеке является ли индекс i == length-1 и положи туда ws.send(JSON.stringify({"id":id,"status":"ok","dat a":"done"}));

CrazyBite 28.12.2016 14:20

Цитата:

Сообщение от Coriolan161 (Сообщение 439174)
CrazyBite,

Короче просто проверь в коллбеке является ли индекс i == length-1 и положи туда ws.send(JSON.stringify({"id":id,"status":"ok","dat a":"done"}));

Не катит, если одна из строк выдаст ошибку это косяк... а не done. Наверно клиенту построчно буду выводить результаты, а он их должен будет отлавливать... неудобно как то...
Если придут в голову другие варианты - отпишитесь.

Mirko1 28.12.2016 22:08

function add_data(ws,id,data){
	
	if (typeof data == "undefined"){
		ws.send(JSON.stringify({"id":id,"status":"error","reason":"bad data"}));
		return;
	}	
	for (var i=0;i<data.length;i++){
		var rows = ['req_num', 'req_date', 'exec_date', 'exec_fio', 'exec_org', 'skuname', 'apparea', 'confchange', 'paramdescr', 'devices', 'attach', 'org', 'post', 'fio', 'org1', 'post1', 'fio1', 'org2', 'post2', 'fio2', 'org3', 'post3', 'fio3', 'change1', 'fio_ptk1', 'change2', 'fio_ptk2', 'change3', 'fio_ptk3', 'change4', 'fio_ptk4', 'change5', 'fio_ptk5', 'change6', 'fio_ptk6'];
		for (var j=0;j<rows.length; j++){			
			if (typeof data[i][rows[j]] == undefined){
				ws.send(JSON.stringify({"id":id,"status":"error","reason":"bad keys"}));
				return false;
			}
		}
		var post = {'req_num':data[i]['req_num'], 'req_date':data[i]['req_date'], 'exec_date':data[i]['exec_date'], 'exec_fio':data[i]['exec_fio'], 'exec_org':data[i]['exec_org'], 'skuname':data[i]['skuname'], 'apparea':data[i]['apparea'], 'confchange':data[i]['confchange'], 'paramdescr':data[i]['paramdescr'], 'devices':data[i]['devices'], 'attach':data[i]['attach'], 'org':data[i]['org'], 'post':data[i]['post'], 'fio':data[i]['fio'], 'org1':data[i]['org1'], 'post1':data[i]['post1'], 'fio1':data[i]['fio1'], 'org2':data[i]['org2'], 'post2':data[i]['post2'], 'fio2':data[i]['fio2'], 'org3':data[i]['org3'], 'post3':data[i]['post3'], 'fio3':data[i]['fio3'], 'change1':data[i]['change1'], 'fio_ptk1':data[i]['fio_ptk1'], 'change2':data[i]['change2'], 'fio_ptk2':data[i]['fio_ptk2'], 'change3':data[i]['change3'], 'fio_ptk3':data[i]['fio_ptk3'], 'change4':data[i]['change4'], 'fio_ptk4':data[i]['fio_ptk4'], 'change5':data[i]['change5'], 'fio_ptk5':data[i]['fio_ptk5'], 'change6':data[i]['change6'], 'fio_ptk6':data[i]['fio_ptk6'], 'sync':0};
		var err = false;
		var query = connection.query("INSERT INTO  `db_requests` SET ?",post, function(err, result) {
			if (err){
				ws.send(JSON.stringify({"id":id,"status":"error","reason":err.code}));
				return; // Как вот тут выйти из функции?
			}

	                ws.send(JSON.stringify({"id":id,"status":"ok","data":"done"}));
		});		
				
		console.log(err);

	}
}


Вот так результат отправится после запроса в бд

А из функции у вас и так выйдет при ошибке! У вас же написано return. Возможно вы хотите что-то другое тут? Уточните ответ

CrazyBite 29.12.2016 07:48

Цитата:

Сообщение от Mirko1 (Сообщение 439225)

Вот так результат отправится после запроса в бд

А из функции у вас и так выйдет при ошибке! У вас же написано return. Возможно вы хотите что-то другое тут? Уточните ответ

Этот return выходит из функции колбека conncetion.query.

Mirko1 30.12.2016 21:43

напишите "return" вместо "var query =", в 17й строке


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