13.10.2020, 19:51
|
Аспирант
|
|
Регистрация: 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>
|
|
13.10.2020, 22:00
|
|
Профессор
|
|
Регистрация: 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.
|
|
15.10.2020, 07:29
|
Аспирант
|
|
Регистрация: 16.08.2020
Сообщений: 53
|
|
Как это решить?
Последний раз редактировалось riaron, 15.10.2020 в 08:03.
|
|
15.10.2020, 09:11
|
|
Профессор
|
|
Регистрация: 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.
|
|
15.10.2020, 11:35
|
Аспирант
|
|
Регистрация: 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.
|
|
15.10.2020, 12:22
|
|
Профессор
|
|
Регистрация: 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; и пошел на следующую итерацию цикла.
|
|
15.10.2020, 14:30
|
|
Профессор
|
|
Регистрация: 08.11.2017
Сообщений: 642
|
|
как orderid и limit связаны?
зачем их доставать ) в цикле когда можно написать orderid in (...)
в общем, предлагаю переписать app.get('/orders/ age', (req, res) =>
все эти подсчеты можно выбрать одним селектом )
|
|
16.10.2020, 11:26
|
Аспирант
|
|
Регистрация: 16.08.2020
Сообщений: 53
|
|
как передать переменную length и массив orderids в последний then
|
|
16.10.2020, 11:41
|
|
Профессор
|
|
Регистрация: 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]
})
|
|
16.10.2020, 12:37
|
Аспирант
|
|
Регистрация: 16.08.2020
Сообщений: 53
|
|
Можете на примере показать?
|
|
|
|