20.09.2020, 13:16
|
Аспирант
|
|
Регистрация: 16.08.2020
Сообщений: 53
|
|
выдает 500 хотя как бы ни было обращятся должен к одному res
выдает 500 хотя как бы ни было обращятся должен к одному res
app.get('/smart', function(req, res) {
var order;
var side;
var prmin;
var prmax;
order=req.cookies.sett;
if(order=='price'){
side=req.cookies.sideprice;
}else if(order='popularity'){
side=req.cookies.sidepopularity;
}else if(order='tsale'){
side='tsale';
}
if(!order){order='name';}
if(!side){side='ASC';}
var query;
var smartphopneList=[];
// Connect to MySQL database.
var connection = getMySQLConnection();
var connection1 = getMySQLConnection();
connection1.connect();
// Do the query to get data.
quer='SELECT `id`,`prod`,`name`,`description`,`photo`,`price`,`popularity`,`sale`,(`price` -`price` / 100 * `sale`) AS `tsale` FROM `smartphone` ORDER BY `tsale` ASC';
connection1.query(quer, function(err, rowes, fields) {
// Loop check on each row
prmin=rowes[0].tsale;
prmax=rowes[(rowes.length-1)].tsale;
// Render index.pug page using array
});
connection1.end();
if(req.cookies.prmin==true){
prmin=req.cookies.prmin;
}
if(req.cookies.prmax==true){
prmin=req.cookies.prmax;
}
connection.connect();
query='SELECT `id`,`prod`,`name`,`description`,`photo`,`price`,`popularity`,`sale`,(`price` -`price` / 100 * `sale`) AS `tsale` FROM `smartphone` WHERE `price` >= '+prmin+' AND `price` <= '+prmax+' ORDER BY '+order +' '+side;
connection.query(query, function(err, rows, fields) {
if (err) {
res.status(500).json({"status_code": 500,"status_message": "internal server error"});
console.log(err);
} else {
// Loop check on each row
for (var i = 0; i < rows.length; i++) {
// Create an object to save current row's data
var smartphopne = {
'id':rows[i].id,
'prod':rows[i].prod,
'name':rows[i].name,
'photo':rows[i].photo,
'description':rows[i].description,
'price':rows[i].price,
'sale':rows[i].sale,
'len':rows.length,
'tsale':rows[i].tsale,
'prmin':prmin,
'prmax':prmax,
}
// Add object into array
smartphopneList.push(smartphopne);
}
// Render index.pug page using array
res.render('index', {"smartphopneList": smartphopneList});
}
});
// Close the MySQL connection
connection.end();
});
|
|
20.09.2020, 13:52
|
Аспирант
|
|
Регистрация: 16.08.2020
Сообщений: 53
|
|
Говорит Ошибка в. Запросе
|
|
20.09.2020, 13:58
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Если есть какая-то неясность, то смотрите лог сервера, там все должно быть написано.
Еще я бы на вашем месте:
- не создавал бы на каждый запрос новое соединение, а использовал пул персистентных соединений, подключаемых из отдельного файла;
- вместо драйвера БД на коллбэках использовал бы драйвер (или обертку) на промисах;
- ошибки бы передавал в отдельный класс/функцию, даже если эта функция просто будет передавать instance ошибки в консоль;
- имплементацию реквеста к роуту вынес бы в отдельный класс-контроллер;
- вместо plain-object'а модели Smartphone использовал бы отдельный класс Smartphone, который к тому же наследовался бы от псевдо-абстрактного класса модели (для менее геморройного расширения базовой функциональности).
|
|
20.09.2020, 13:59
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Сообщение от riaron
|
Говорит Ошибка в. Запросе
|
у вас в консоль передается экземпляр ошибки, там все детально должно быть описано, чтобы не гадать по коду.
|
|
20.09.2020, 14:33
|
Аспирант
|
|
Регистрация: 16.08.2020
Сообщений: 53
|
|
вот ошибка: бд есть значения но почему то не выводит. поменял значения вручную, запрос выдает значения во вью а в запросе пишет undefined. когда втавляю в typeof тоже пишет number
Error: ER_BAD_FIELD_ERROR: Unknown column 'undefined' in 'where clause'
at Query.Sequence._packetToError (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Query.ErrorPacket (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\sequences\Query.js:79:18)
at Protocol._parsePacket (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\Protocol.js:291:23)
at Parser._parsePacket (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\Parser.js:433:10)
at Parser.write (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\Parser.js:43:10)
at Protocol.write (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket.<anonymous> (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\Connection.js:88:28)
at Socket.<anonymous> (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (events.js:315:20)
at addChunk (_stream_readable.js:295:12)
--------------------
at Protocol._enqueue (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Connection.query (C:\xampp\htdocs\mysite.local\node_modules\mysql\lib\Connection.js:198:25)
at C:\xampp\htdocs\mysite.local\app.js:161:13
at Layer.handle [as handle_request] (C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\layer.js:95:5)
at next (C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\layer.js:95:5)
at C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\index.js:281:22
at Function.process_params (C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\index.js:335:12)
at next (C:\xampp\htdocs\mysite.local\node_modules\express\lib\router\index.js:275:10) {
code: 'ER_BAD_FIELD_ERROR',
errno: 1054,
sqlMessage: "Unknown column 'undefined' in 'where clause'",
sqlState: '42S22',
index: 0,
sql: 'SELECT `id`,`prod`,`name`,`description`,`photo`,`price`,`popularity`,`sale`,(`price` -`price` / 100 * `sale`) AS `tsale` FROM `smartphone` WHERE `price` >= undefined AND `price` <= undefined ORDER BY popularity ASC'
}
Последний раз редактировалось riaron, 20.09.2020 в 15:13.
|
|
20.09.2020, 23:40
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Вот же ответ на причину - `price` >= undefined AND `price` <= undefined, то есть значения не определены, а запросом ожидается никак не строка. Так как undefined, это строка не обрамленная кавычками, то SQL трактует это как сравнение полей price и undefined, которого в таблице нет.
И, кстати, проще такое условие в SQL записать так:
WHERE `price` BETWEEN min AND max
где min/max наименьшее и наибольшее значение цены.
Последний раз редактировалось laimas, 21.09.2020 в 00:10.
|
|
21.09.2020, 12:01
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
riaron,
у тебя асинхронные операции.
путь к спасению заблудшей прогерской души:
1) разобраться, что такое асинхронность https://learn.javascript.ru/async
2) в твоей библиотеке подключения к mysql использовать промисный вариант api (если нет, запилить обертку, но готов поставить зуб и полжопы, что есть) в сочетании с async/await.
3) в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale, его использовать. Навскидку оный подзапрос будет внутри from, но лучше поэкспериментировать.
|
|
21.09.2020, 17:14
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Alexandroppolus
|
в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale
|
В данном случае вообще нужен только один запрос, первый, ибо если таблица имеет значения от 1 до 5, то выборка диапазона от min/max будет равна пяти записям. И результат выборки никак не измениться если значение 1..5 увеличить/уменьшить на какое либо значение, и второй запрос лишен всякого смысла.
PS. Хотя то что извлекается из первого запроса, это вообще не понять что.
Последний раз редактировалось laimas, 21.09.2020 в 17:17.
|
|
21.09.2020, 18:41
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
laimas,
похоже, правда где-то посередине ))
из первого запроса тут используется минимальный и максимальный tsale, судя по всему, это цена со скидной (скидка sale в процентах).
то есть min(tsale), очевидно, будет меньше любого price, если только нет "отрицательных скидок", и с ним сравнивать не надо.
а вот сравнение с максимальным tsale может отсеять дохрена строк. Так что без подзапроса не обойтись.
|
|
21.09.2020, 21:54
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Да, в первом же запросе (`price` -`price` / 100 * `sale`) это алиас. Но запрос с выборкой условий как подзапросы, это слишком большая нагрузка. Выгоднее будет двумя запросами:
'SELECT MIN(`price` -`price` / 100 * `sale`) `pmin`, MAX(`price` -`price` / 100 * `sale`) `pmax` FROM `smartphone`'
а затем выборку по этим параметрам, или, если позволяет версия базы, то попробовать
'WITH tmp (SELECT MIN(`price` -`price` / 100 * `sale`) `pmin`, MAX(`price` -`price` / 100 * `sale`) `pmax` FROM `smartphone`)
SELECT * FROM `smartphone` WHERE `price` BETWEEN (SELECT pmin FROM tmp) AND (SELECT pmax FROM tmp)'
|
|
|
|