не могу понять где ошибка
подскажите где ошибка
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> |
А в чем она проявляется?
Я вижу одну проблему Обработчик connection.query(sql3 - вычисляет length Обработчик connection.query(sql2 - вычисляет orderids Которые потом используются в обработчике connection.query(sql1 Но connection.query - асинхронные. И нет никакой гарантии, что запрос sql1 не завершится раньше, чем sql2. И orderids будет не определен к этому моменту |
Как это решить?
|
Цитата:
Я не большой знаток 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 - проще и понятнее. |
отредактировал сделал так
]).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' }); } |
У вас в 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; и пошел на следующую итерацию цикла. |
как orderid и limit связаны?
зачем их доставать ) в цикле когда можно написать orderid in (...) в общем, предлагаю переписать app.get('/orders/:page', (req, res) => все эти подсчеты можно выбрать одним селектом ) |
как передать переменную length и массив orderids в последний then
|
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] }) |
Можете на примере показать?
|
Часовой пояс GMT +3, время: 18:07. |