Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.10.2020, 19:51
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 16.08.2020
Сообщений: 53

не могу понять где ошибка
подскажите где ошибка

app.get('/orders/:page', (req, res) => {
        var connection = getMySQLConnection();
    var smartphone=[];
    var allsmartphone={};
    var smartphoneList=[];
    var allprice=0;
    var a;
    var b;
    var length;
	var orderids
    var raddr=req.connection.remoteAddress;
var start;
var end;
var allprice;
start=(req.params.page-1)*10;
end=req.params.page*10;
allprice=0;
    connection.connect(function(err) {
        if (err) throw err;
		var sql3='SELECT `id` FROM `orders`';
		var sql2='SELECT `orderid` FROM `orders` GROUP BY  `orderid`';
        var valuesii = [raddr];
		 connection.query(sql3, [], function (err, resulta) {
            if (err){
                console.log(err);

			}else{
				length=resulta.length;
				if(start<0){start=0;}
                if(end>(length-req.params.page*10)%10){end=length;}
			}
		 });connection.query(sql2, [], function (err, result) {
            if (err){
                console.log(err);

			}else{
				orderids=result;
			}
		 });
        var sql ='SELECT `id`,`prod`,`name`,`photo`,`price`,`sale`,`remote_adr`,`quantity` FROM `orders` LIMIT ?,?';

        connection.query(sql, [start,end], function (err, results) {
            if (err){
                console.log(err);

            }else{

				for(var j=0;j<1;j++) {
                    allprice = 0;
                    for (var i = 0; i < 1; i++) {
                        // Create the object to save the data.
                        b = results[i].price - results[i].price * results[i].sale / 100;
                        a = b * results[i].quantity;
                        allprice += a;
                        var smart = {
                            'id': results[i].id,
                            'prod': results[i].prod,
                            'name': results[i].name,
                            'photo': results[i].photo,
                            'sale': results[i].sale,
                            'price': results[i].price,
                            'tsale': b,
                            'vsego': a,
                            'quantity': results[i].quantity,
                            'allprice': allprice,
                        };
                        smartphone.push(smart);

                    }
                    allsmartphone[orderids[j]['orderid']][j] = smartphone;
                }
					var smartphoneList={
						'len':length,
						'jlen':end,
						'ip':valuesii,
					}
					console.log(orderids[1]['orderid']+" :smart: "+allsmartphone[orderids[1]['orderid']][0]['id']);
					res.render('orders', {"smartphoneList": smartphoneList,"allsmartphone": allsmartphone,'orderids':orderids});
            }
			});
		
		

        });
});




<table>
        <%for (var j=0;j<orderids.length;j++){%>
             <%for(var i=0;i<smartphoneList['jlen'];i++){%>
                <tr></tr>
                <tr>

                    <td class="leftitem" style="padding:10px;border-left:1px solid silver;border-top:1px solid silver;border-bottom:1px solid silver;">
                        <img class="imgind" style="height:200px;width:200px" src="<%= allsmartphone[orderids[j]['orderid']][i]['photo'];%>" />
                        <p>
                            Производитель: <%= allsmartphone[orderids[j]['orderid']][i]['prod'];%><br>
                            Модель:  <%= allsmartphone[orderids[j]['orderid']][i]['name'];%><br>
                            Цена: <%= allsmartphone[orderids[j]['orderid']][i]['price'];%><br>
                            <%if(allsmartphone[orderids[j]['orderid']][i]['sale']){%>Цена со скидкой:<%=allsmartphone[orderids[j]['orderid']][i]['tsale'];%>  <br><%}%>
                        </p>
                    </td>
                    <td style="padding:10px;border-top:1px solid silver;border-bottom:1px solid silver;">
                        <input type="text" id="quan" onblur="quanaddbasket(this.value,{<%= allsmartphone[orderids[j]['orderid']][i]['id'];%>})" name="quan" value="<%=allsmartphone[orderids[j]['orderid']][i]['quantity'];%>" />
                    </td>
                    <td style="padding:10px;border-top:1px solid silver;border-bottom:1px solid silver;">Всего: <%= allsmartphone[orderids[j]['orderid']][i]['vsego'];%><td>

                    </td>
                    <td style="padding:10px;border-top:1px solid silver;border-right:1px solid silver;border-bottom:1px solid silver;"></td>
                <tr>
                <tr></tr>
             <%}%>

        <%}%>
    </table>
Ответить с цитированием
  #2 (permalink)  
Старый 13.10.2020, 22:00
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

А в чем она проявляется?

Я вижу одну проблему
Обработчик connection.query(sql3 - вычисляет length
Обработчик connection.query(sql2 - вычисляет orderids
Которые потом используются в обработчике connection.query(sql1
Но connection.query - асинхронные. И нет никакой гарантии, что запрос sql1 не завершится раньше, чем sql2. И orderids будет не определен к этому моменту

Последний раз редактировалось voraa, 13.10.2020 в 22:14.
Ответить с цитированием
  #3 (permalink)  
Старый 15.10.2020, 07:29
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 16.08.2020
Сообщений: 53

Как это решить?

Последний раз редактировалось riaron, 15.10.2020 в 08:03.
Ответить с цитированием
  #4 (permalink)  
Старый 15.10.2020, 09:11
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

Сообщение от riaron
Как это решить?
Использовать Promise.
Я не большой знаток node, но вроде есть библиотека, для работы с mysql основанная на promise.

Можно и с этой попытаться самому сделать через Promise.
Эти запросы можно изобразить как то так
function pquery (con, sql, par) {
	return new Promise ( (res, rej) => {
		con.query (sql, par,  (err, result) => {
				if (err) {
					rej (err);
				} else {
					res (result);
				}
			})
	})
}

var sql3='SELECT `id` FROM `orders`';
var sql2='SELECT `orderid` FROM `orders` GROUP BY  `orderid`';
var sql1 ='SELECT `id`,`prod`,`name`,`photo`,`price`,`sale`,`remote_adr`,`quantity` FROM `orders` LIMIT ?,?';

Promise.all([
	pquery (connection, sql3, []).then( resulta => {
		length=resulta.length;
		if(start<0){start=0;}
		if(end>(length-req.params.page*10)%10){end=length;}
	}), 
	pquery (connection, sql2, []).then( result => {
		orderids=result;
	})
]).then ( () => {
	return pquery (connection, sql1, [start,end]).then ( results => {
		for(var j=0;j<1;j++) {
			allprice = 0;
			for (var i = 0; i < 1; i++) {
				// Create the object to save the data.
				b = results[i].price - results[i].price * results[i].sale / 100;
				a = b * results[i].quantity;
				allprice += a;
				var smart = {
					'id': results[i].id,
					'prod': results[i].prod,
					'name': results[i].name,
					'photo': results[i].photo,
					'sale': results[i].sale,
					'price': results[i].price,
					'tsale': b,
					'vsego': a,
					'quantity': results[i].quantity,
					'allprice': allprice,
				};
				smartphone.push(smart);
		 
			}
			allsmartphone[orderids[j]['orderid']][j] = smartphone;
		}
		var smartphoneList={
			'len':length,
			'jlen':end,
			'ip':valuesii,
		}
		console.log(orderids[1]['orderid']+" :smart: "+allsmartphone[orderids[1]['orderid']][0]['id']);
		res.render('orders', {"smartphoneList": smartphoneList,"allsmartphone": allsmartphone,'orderids':orderids});
		}
	);
}).catch (err => {
	console.log(err);
})


Запросы sql2 и sql3 могут выполняться параллельно. А запрос sql1 гарантированно только после того, как sql2 и sql3 будут исполнены

Ну или делать вложенные обратные вызовы.
Сначала делать запрос sql3, в его обратном вызове делать запрос sql2, а в его обратном вызове - запрос sql1.

По мне, через Promise - проще и понятнее.

Последний раз редактировалось voraa, 15.10.2020 в 09:24.
Ответить с цитированием
  #5 (permalink)  
Старый 15.10.2020, 11:35
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 16.08.2020
Сообщений: 53

отредактировал сделал так
]).then ( () => {
	for(var j=0;j<orderids.length;j++) {
		allprice = 0;
			var sql1 ='SELECT `id`,`prod`,`name`,`photo`,`price`,`sale`,`remote_adr`,`quantity` FROM `orders` where `orderid`=? LIMIT ?,?';
		return pquery (connection, sql1, [orderids[j],start,end]).then ( results => {
				for (var i = 0; i < end; i++) {
					// Create the object to save the data.
					b = results[i].price - results[i].price * results[i].sale / 100;//166 строка
					a = b * results[i].quantity;
					allprice += a;
					var smart = {
						'id': results[i].id,
						'prod': results[i].prod,
						'name': results[i].name,
						'photo': results[i].photo,
						'sale': results[i].sale,
						'price': results[i].price,
						'tsale': b,
						'vsego': a,
						'quantity': results[i].quantity,
						'allprice': allprice,
					};
					smartphone.push(smart);
				}
			}
		);
			var smartphoneList={
				'len':length,
				'jlen':end,
			}
		allsmartphone[j] = smartphone;
		console.log(orderids);
			res.render('orders', {"smartphoneList": smartphoneList,"allsmartphone": allsmartphone,'orderids':orderids});
		}
	}).catch (err => {

выдает ошибку
TypeError: Cannot read property 'price' of undefined
at C:\xampp\htdocs\mysite.local\app.js:166:21
at processTicksAndRejections (internal/process/task_queues.js:97:5)

надо ли с функцией ниже что то делать?
function getMySQLConnection() {
return mysql.createConnection({
host : 'localhost',
user : 'root',
password : '',
database : 'elektronika'
});
}

Последний раз редактировалось riaron, 15.10.2020 в 11:38.
Ответить с цитированием
  #6 (permalink)  
Старый 15.10.2020, 12:22
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,744

У вас в SQL стоит LIMIT start, end
Но это не более end записей.
А цикл
for (let i = 0; i < end; i++) {

Вы уверены, что каждый раз будет end записей, не меньше?

res.render('orders', {"smartphoneList": smartphoneList,"allsmartphone": allsmartphone,'orderids':orderids});
находится внутри цикла по j. Так действительно должно быть?

Далее. Мы используем асинхронные операции.
Вот, например
allsmartphone[j] = smartphone;
А smartphone тут еще не посчитан. Он будет посчитан, только когда исполнится соответствующий запрос. Javascript не ждет. Он запустил запрос, сказал: когда Promise разрешится, выполни то, что указано в then
и пошел выполнять дальше. Выполнил allsmartphone[j] = smartphone; и пошел на следующую итерацию цикла.
Ответить с цитированием
  #7 (permalink)  
Старый 15.10.2020, 14:30
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

как orderid и limit связаны?
зачем их доставать ) в цикле когда можно написать orderid in (...)

в общем, предлагаю переписать app.get('/orders/age', (req, res) =>

все эти подсчеты можно выбрать одним селектом )
Ответить с цитированием
  #8 (permalink)  
Старый 16.10.2020, 11:26
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 16.08.2020
Сообщений: 53

как передать переменную length и массив orderids в последний then
Ответить с цитированием
  #9 (permalink)  
Старый 16.10.2020, 11:41
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Promise
  .resolve({ data: [1, 2, 3] })
  .then(data => {
    return data
  })
  .then(dataAgain => {
    return dataAgain
  }).then(dataAgainAgain => {
    return Promise
      .resolve(dataAgainAgain)
      .then(dataAgainAgainAgain => {
        dataAgainAgainAgain.data.push(4)
        return dataAgainAgainAgain
      })
  }).then(dataAgainAgainAgainWith4 => {
    console.log(dataAgainAgainAgainWith4) // [1,2,3,4]
  })
Ответить с цитированием
  #10 (permalink)  
Старый 16.10.2020, 12:37
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 16.08.2020
Сообщений: 53

Можете на примере показать?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где может быть ошибка в скрипте? LADYX Элементы интерфейса 0 14.04.2017 15:28
setTimeout где ошибка? кирикала Элементы интерфейса 5 05.09.2016 13:53
Не могу понять, где ошибка в коде Darya_kod Общие вопросы Javascript 5 10.07.2016 22:13
Не могу понять Замыкание. slip AJAX и COMET 7 19.01.2013 14:40
не могу понять в чём ошибка scuter Общие вопросы Javascript 2 28.08.2008 15:22