выдает 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(); }); |
Говорит Ошибка в. Запросе
|
Если есть какая-то неясность, то смотрите лог сервера, там все должно быть написано.
Еще я бы на вашем месте: - не создавал бы на каждый запрос новое соединение, а использовал пул персистентных соединений, подключаемых из отдельного файла; - вместо драйвера БД на коллбэках использовал бы драйвер (или обертку) на промисах; - ошибки бы передавал в отдельный класс/функцию, даже если эта функция просто будет передавать instance ошибки в консоль; - имплементацию реквеста к роуту вынес бы в отдельный класс-контроллер; - вместо plain-object'а модели Smartphone использовал бы отдельный класс Smartphone, который к тому же наследовался бы от псевдо-абстрактного класса модели (для менее геморройного расширения базовой функциональности). |
Цитата:
|
вот ошибка: бд есть значения но почему то не выводит. поменял значения вручную, запрос выдает значения во вью а в запросе пишет 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' } |
Вот же ответ на причину - `price` >= undefined AND `price` <= undefined, то есть значения не определены, а запросом ожидается никак не строка. Так как undefined, это строка не обрамленная кавычками, то SQL трактует это как сравнение полей price и undefined, которого в таблице нет.
И, кстати, проще такое условие в SQL записать так: WHERE `price` BETWEEN min AND max где min/max наименьшее и наибольшее значение цены. |
riaron,
у тебя асинхронные операции. путь к спасению заблудшей прогерской души: 1) разобраться, что такое асинхронность https://learn.javascript.ru/async 2) в твоей библиотеке подключения к mysql использовать промисный вариант api (если нет, запилить обертку, но готов поставить зуб и полжопы, что есть) в сочетании с async/await. 3) в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale, его использовать. Навскидку оный подзапрос будет внутри from, но лучше поэкспериментировать. |
Цитата:
PS. Хотя то что извлекается из первого запроса, это вообще не понять что. |
laimas,
похоже, правда где-то посередине )) из первого запроса тут используется минимальный и максимальный tsale, судя по всему, это цена со скидной (скидка sale в процентах). то есть min(tsale), очевидно, будет меньше любого price, если только нет "отрицательных скидок", и с ним сравнивать не надо. а вот сравнение с максимальным tsale может отсеять дохрена строк. Так что без подзапроса не обойтись. |
Да, в первом же запросе (`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)' |
Часовой пояс GMT +3, время: 13:31. |