Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   выдает 500 хотя как бы ни было обращятся должен к одному res (https://javascript.ru/forum/node-js-io-js/81045-vydaet-500-khotya-kak-ni-bylo-obrashhyatsya-dolzhen-k-odnomu-res.html)

riaron 20.09.2020 13:16

выдает 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();
	
});

riaron 20.09.2020 13:52

Говорит Ошибка в. Запросе

Nexus 20.09.2020 13:58

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

Еще я бы на вашем месте:
- не создавал бы на каждый запрос новое соединение, а использовал пул персистентных соединений, подключаемых из отдельного файла;
- вместо драйвера БД на коллбэках использовал бы драйвер (или обертку) на промисах;
- ошибки бы передавал в отдельный класс/функцию, даже если эта функция просто будет передавать instance ошибки в консоль;
- имплементацию реквеста к роуту вынес бы в отдельный класс-контроллер;
- вместо plain-object'а модели Smartphone использовал бы отдельный класс Smartphone, который к тому же наследовался бы от псевдо-абстрактного класса модели (для менее геморройного расширения базовой функциональности).

Nexus 20.09.2020 13:59

Цитата:

Сообщение от riaron
Говорит Ошибка в. Запросе

у вас в консоль передается экземпляр ошибки, там все детально должно быть описано, чтобы не гадать по коду.

riaron 20.09.2020 14:33

вот ошибка: бд есть значения но почему то не выводит. поменял значения вручную, запрос выдает значения во вью а в запросе пишет 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'
}

laimas 20.09.2020 23:40

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

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

WHERE `price` BETWEEN min AND max

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

Alexandroppolus 21.09.2020 12:01

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

путь к спасению заблудшей прогерской души:
1) разобраться, что такое асинхронность https://learn.javascript.ru/async
2) в твоей библиотеке подключения к mysql использовать промисный вариант api (если нет, запилить обертку, но готов поставить зуб и полжопы, что есть) в сочетании с async/await.
3) в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale, его использовать. Навскидку оный подзапрос будет внутри from, но лучше поэкспериментировать.

laimas 21.09.2020 17:14

Цитата:

Сообщение от Alexandroppolus
в данном конкретном кейсе дело решается одним запросом - просто в подзапросе надо выяснить max и min для tsale

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

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

Alexandroppolus 21.09.2020 18:41

laimas,
похоже, правда где-то посередине ))
из первого запроса тут используется минимальный и максимальный tsale, судя по всему, это цена со скидной (скидка sale в процентах).
то есть min(tsale), очевидно, будет меньше любого price, если только нет "отрицательных скидок", и с ним сравнивать не надо.
а вот сравнение с максимальным tsale может отсеять дохрена строк. Так что без подзапроса не обойтись.

laimas 21.09.2020 21:54

Да, в первом же запросе (`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.