Permalänk

Mysql och node JS = Backend

Hej

Jag har en Backend som hämtar en db med hjälp av:
Mysql och NPM = Node JS Backend

Som sedan ska skicka resultatet till min Frontend app. Backend kod:

// Övning med routes const express = require('express'); const app = express(); let cors = require('cors'); var mysql = require('mysql'); app.use(express.json()); app.use(cors()); const port = 3001; let sqlSelect = 'SELECT * FROM data'; let count = 0; runSQLConn(sqlSelect); setInterval(runSQLConn, 1000, sqlSelect); function runSQLConn(sqlSelect) { console.log('23'); count+= 1; console.log('Runda:'); console.log(count); console.log(sqlSelect); console.log('14'); console.log(sqlSelect); var con = mysql.createConnection({ host: "localhost", user: "root", password: 'htrhftyjd', database: 'scheduleapp' }); con.connect(function(err) { if (err) throw err; console.log("Ansluten till DB :)"); //sendSelectToSql(sqlSelect); con.query(sqlSelect, function (err, resultToFrontend) { console.log(resultToFrontend); if (err) throw err; // Send the SQL into the Frontend App ============================================================================= runAppGetRequests(resultToFrontend); //return resultToFrontend; }); }); //con.destroy(); } app.post('/SQLData/filter', (req, res) => { sqlSelect = `SELECT ${req.body.select} FROM data`; console.log('49'); runSQLConn(sqlSelect); res.status(201).send(); }); function runAppGetRequests(resultToFrontend) { app.get('/SQLData', (req, res) => { console.log('56'); console.log(resultToFrontend); res.status(201).send(resultToFrontend); }); console.log('-----------------------------------'); } function runAppRequests(resultToFrontend) { } /* function sendSelectToSql(sqlSelect){ } */ //} /* function appGet(resultToFrontend){ console.log('37'); } */ app.listen(port, () => console.log(`getSQLData is listening on port ${port}!`));

Testar så därav /**/

Det jag vill är att när ny eller jag förändrar sql db så vill jag att min data uppdateras automatisk. Problemet är att efter ett otal avslutningar så får jag:
Error: ER_CON_COUNT_ERROR: Too many connections. Har provat att köra --> con.destroy();

Resutatet är att jag inte kan köra get och ingen data kommer?

Hur löser jag detta?

Mvh Fredrik

Visa signatur

Computer: Windows 10, 64-bit, Intel i9 - 10850K, Asus Rog MAXIMUS XII HERO (WI-FI), 32GB RAM, Asus RTX3070

Game control: Home Cockpit, Keyboard, Saitek Pro Flight X-56 Rhino H.O.T.A.S. 

Permalänk
Medlem

Felet beror på att du inte stänger anslutningarna, efter ett antal frågor når du taket på antalet anslutningar och inga fler kan skapas.

Jag antar att du stänger en anslutning med:
con.close() eller con.disconnect()
Vet ej vad con.destroy() gör.

Permalänk
Hedersmedlem

@freddehboy Vänligen förtydliga rubriken i enlighet med §3.1.

Visa signatur

Danskjävel så krattar som en skrivare...

Permalänk
Medlem
Citat:

Terminating a connection gracefully is done by calling the end() method

Citat:

An alternative way to end the connection is to call the destroy() method. This will cause an immediate termination of the underlying socket.

end() känns mer rätt, då jag tolkar det som att destroy() helt sonika dödar anslutningen på klient-sidan utan att meddela servern.

EDIT:
Sen kan ju connection pooling kanske vara av intresse också, för att återanvända anslutningarna istället för att skapa nya hela tiden.

Visa signatur

as far as we can tell, the massacre went well...

Permalänk

Mysql och node JS = Backend

Ska testa

Visa signatur

Computer: Windows 10, 64-bit, Intel i9 - 10850K, Asus Rog MAXIMUS XII HERO (WI-FI), 32GB RAM, Asus RTX3070

Game control: Home Cockpit, Keyboard, Saitek Pro Flight X-56 Rhino H.O.T.A.S. 

Permalänk
Skrivet av Kent:

@freddehboy Vänligen förtydliga rubriken i enlighet med §3.1.

Hur fixar jag det? Provade men rubriken är fortfarande samma?

Blev fel rubrik då jag skrev!

Visa signatur

Computer: Windows 10, 64-bit, Intel i9 - 10850K, Asus Rog MAXIMUS XII HERO (WI-FI), 32GB RAM, Asus RTX3070

Game control: Home Cockpit, Keyboard, Saitek Pro Flight X-56 Rhino H.O.T.A.S. 

Permalänk

Ett tips är att spana in knex.js för att dels underlätta connection-hanteringen samt dina queries.
http://knexjs.org/

Permalänk
Medlem
Skrivet av luddecraft:

Ett tips är att spana in knex.js för att dels underlätta connection-hanteringen samt dina queries.
http://knexjs.org/

MySQL projektet han importerat har redan stöd för pooling.

Sedan bör OP även escapea sina queries och inte bara ta emot de i blindo.

Permalänk
Skrivet av JeanC:

MySQL projektet han importerat har redan stöd för pooling.

Sedan bör OP även escapea sina queries och inte bara ta emot de i blindo.

Ja, och knex.js använder samma lib i botten för anslutningen till MySQL...

Det hela handlar ju om convenience. Genom att använda knex.js så slipper användaren själv skriva logiken för att skapa poolen, stänga connections etc.

Permalänk
Medlem
Skrivet av luddecraft:

Ja, och knex.js använder samma lib i botten för anslutningen till MySQL...

Det hela handlar ju om convenience. Genom att använda knex.js så slipper användaren själv skriva logiken för att skapa poolen, stänga connections etc.

Vet inte om pool.query(queryn, parameter, result) som är en shortcut för getConnection, .query och .release är så jävla krångligt att jag behöver en wrapper som gör samma sak; bara extra overhead.

https://github.com/mysqljs/mysql#pooling-connections

Min poäng är att knex i det här fallet gör det hela krångligare.

--
EDIT:
Igen: mysql biblioteket har det INBYGGT med pooling och escaping av parametrar.

Permalänk

Min poäng är att knex i detta fallet gör det hela enklare.
Dels så gömmer den undan all hantering av pool och du får dessutom automatisk escaping av parametrar samt att du enklare kan bygga upp komplicerade queries.

Permalänk

Ska titta på Knex senare. Tack för tipset

Visa signatur

Computer: Windows 10, 64-bit, Intel i9 - 10850K, Asus Rog MAXIMUS XII HERO (WI-FI), 32GB RAM, Asus RTX3070

Game control: Home Cockpit, Keyboard, Saitek Pro Flight X-56 Rhino H.O.T.A.S.