Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.09.2020, 13:16
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 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();
	
});
Ответить с цитированием
  #2 (permalink)  
Старый 20.09.2020, 13:52
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 16.08.2020
Сообщений: 53

Говорит Ошибка в. Запросе
Ответить с цитированием
  #3 (permalink)  
Старый 20.09.2020, 13:58
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Если есть какая-то неясность, то смотрите лог сервера, там все должно быть написано.

Еще я бы на вашем месте:
- не создавал бы на каждый запрос новое соединение, а использовал пул персистентных соединений, подключаемых из отдельного файла;
- вместо драйвера БД на коллбэках использовал бы драйвер (или обертку) на промисах;
- ошибки бы передавал в отдельный класс/функцию, даже если эта функция просто будет передавать instance ошибки в консоль;
- имплементацию реквеста к роуту вынес бы в отдельный класс-контроллер;
- вместо plain-object'а модели Smartphone использовал бы отдельный класс Smartphone, который к тому же наследовался бы от псевдо-абстрактного класса модели (для менее геморройного расширения базовой функциональности).
Ответить с цитированием
  #4 (permalink)  
Старый 20.09.2020, 13:59
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,723

Сообщение от riaron
Говорит Ошибка в. Запросе
у вас в консоль передается экземпляр ошибки, там все детально должно быть описано, чтобы не гадать по коду.
Ответить с цитированием
  #5 (permalink)  
Старый 20.09.2020, 14:33
Аспирант
Отправить личное сообщение для riaron Посмотреть профиль Найти все сообщения от riaron
 
Регистрация: 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.
Ответить с цитированием
  #6 (permalink)  
Старый 20.09.2020, 23:40
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Вот же ответ на причину - `price` >= undefined AND `price` <= undefined, то есть значения не определены, а запросом ожидается никак не строка. Так как undefined, это строка не обрамленная кавычками, то SQL трактует это как сравнение полей price и undefined, которого в таблице нет.

И, кстати, проще такое условие в SQL записать так:

WHERE `price` BETWEEN min AND max

где min/max наименьшее и наибольшее значение цены.

Последний раз редактировалось laimas, 21.09.2020 в 00:10.
Ответить с цитированием
  #7 (permalink)  
Старый 21.09.2020, 12:01
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

riaron,
у тебя асинхронные операции.

путь к спасению заблудшей прогерской души:
1) разобраться, что такое асинхронность https://learn.javascript.ru/async
2) в твоей библиотеке подключения к mysql использовать промисный вариант api (если нет, запилить обертку, но готов поставить зуб и полжопы, что есть) в сочетании с async/await.
3) в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale, его использовать. Навскидку оный подзапрос будет внутри from, но лучше поэкспериментировать.
Ответить с цитированием
  #8 (permalink)  
Старый 21.09.2020, 17:14
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сообщение от Alexandroppolus
в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale
В данном случае вообще нужен только один запрос, первый, ибо если таблица имеет значения от 1 до 5, то выборка диапазона от min/max будет равна пяти записям. И результат выборки никак не измениться если значение 1..5 увеличить/уменьшить на какое либо значение, и второй запрос лишен всякого смысла.

PS. Хотя то что извлекается из первого запроса, это вообще не понять что.

Последний раз редактировалось laimas, 21.09.2020 в 17:17.
Ответить с цитированием
  #9 (permalink)  
Старый 21.09.2020, 18:41
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

laimas,
похоже, правда где-то посередине ))
из первого запроса тут используется минимальный и максимальный tsale, судя по всему, это цена со скидной (скидка sale в процентах).
то есть min(tsale), очевидно, будет меньше любого price, если только нет "отрицательных скидок", и с ним сравнивать не надо.
а вот сравнение с максимальным tsale может отсеять дохрена строк. Так что без подзапроса не обойтись.
Ответить с цитированием
  #10 (permalink)  
Старый 21.09.2020, 21:54
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Да, в первом же запросе (`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)'
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29