• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Problem mit node-mysql

xorg1990

New member
Gleich mal prüfen ab auch jemand in die Kategorie nodejs schaut.

Spass beiseite.

Ich habe da ein kleines Problem mit dem node mysql Modul und zwar sagt es mir nach einer weile:
"db error: {Error: Connection lost: The server closed the connection.] fatal: true code: 'PROTOCOL_CONNECTION_LOST'"

Das connection.end() habe ich gleich im query callback eingebaut.
Bsp:
Code:
connection.query('SELECT 1 + 1 AS solution', function(err, rows, fields) {
   connection.end();
}),

Das aller komische ist, dass die Fehlermeldung zyklisch immer und immer wieder kommt. Obwohl keiner an dem Server operiert.
Was ist das Problem, nutze createConnection();
Muss/kann ich auch so ein Pool benutzen, ich weiß allerdings nichts damit anzufangen was ist der vorteil von den Pooling?

MfG,
xorg1990
 
Zeig' doch mal ein Minimalbeispiel. Ich kann mir vorstellen, dass du eventuell woanders die Verbindung ev. nochmal verwendest und dann aber die Verbindung schon gekappt ist.
 
kkapsner schrieb:
Zeig' doch mal ein Minimalbeispiel. Ich kann mir vorstellen, dass du eventuell woanders die Verbindung ev. nochmal verwendest und dann aber die Verbindung schon gekappt ist.
Wenn ich ein query losfeure und die Verbindung steht nicht mehr, dann schaut die Fehlermeldung anders aus, aber ich habe was anderes entdeckt. Ich habe eine funktion
handleDisconnect(), die rufe ich 2 mal auf, somit werden 2 Verbindung aufgebaut aber ich schleiße nur eine.

Code:
//connect to mysql: mysql --host=localhost --user=root --password=xampp
var bodyParser = require('body-parser');
var session = require("express-session");
var express = require("express");
var mysql = require("mysql");
var linereader = require("line-reader");
var app = express();

var db_config = {
    host: 'localhost',
    user: 'root',
    password: 'xampp',
    database: 'RT_Grabber_Users'
};



var connection;




function handleDisconnect() {

    connection = mysql.createConnection(db_config); // Recreate the connection, since
    // the old one cannot be reused.
    connection.connect(function(err) { // The server is either down
        if (err) { // or restarting (takes a while sometimes).
            console.log('error when connecting to db:', err);
            setTimeout(handleDisconnect, 2000); // We introduce a delay before attempting to reconnect,
        } // to avoid a hot loop, and to allow our node script to
    }); // process asynchronous requests in the meantime.
    // If you're also serving http, display a 503 error.
    connection.on('error', function(err) {
        console.log('db error', err);
        if (err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
            handleDisconnect(); // lost due to either server restart, or a
        } else { // connnection idle timeout (the wait_timeout
            throw err; // server variable configures this)
        }
    });
}



function athenticate(email, password, cb) {
    var re = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
    connection.query("SELECT * FROM Login", function(err, rows) {
        if (err) {
            throw err;
        } else {
            if (re.test(email) == true) {
                for (var i = 0; i < rows.length; i++) {
                    if (rows[i].email == email) {
                        if (rows[i].password == password) {
                            return cb(null, rows[i].id, rows[i].callsign);
                        } else {
                            return cb(new Error("Wrong Password"));
                        }
                    } else {
                        return cb(new Error("Email not found in our Database"));
                    }
                } //for
            } else { //if email
                return cb(new Error("No valide email"));
            }
        }
    });
}



function getGrabberSettings(callsign, GrabberName, cb) {
    //as first get the user id by callsign
    connection.query("SELECT * FROM Login WHERE callsign = ? ", [callsign], function(err, rows) {
        var query = "SELECT * FROM Grabbers WHERE UserID = '" + rows[0].id + "' AND GrabberName = '" + GrabberName + "'";
        connection.query(query, function(err, rows) {
            if (err) {
                return console.log(err.message);
            }
            connection.query("SELECT * FROM GrabberSettings WHERE GrabberID = ?", [rows[0].GrabberID], function(err, rows) {
               //letzter mysql query connection wird beendet 
               connection.end(); 
                var obj = {};
                obj["Windows"] = {};
                for (var i = 0; i < rows.length; i++) {
                    obj["Windows"][rows[i].WindowName] = {};

                    obj["Windows"][rows[i].WindowName]["UserRate"] = rows[i].UserRate;
                    obj["Windows"][rows[i].WindowName]["DSP_Window"] = rows[i].DSP_Window;
                    obj["Windows"][rows[i].WindowName]["ScrollInter"] = rows[i].ScollInter;
                    obj["Windows"][rows[i].WindowName]["FFTInputLength"] = rows[i].FFTInputLength;
                    obj["Windows"][rows[i].WindowName]["F_min"] = rows[i].F_min;
                    obj["Windows"][rows[i].WindowName]["F_max"] = rows[i].F_max;
                    obj["Windows"][rows[i].WindowName]["Offs"] = rows[i].Offset;
                    obj["Windows"][rows[i].WindowName]["db_from"] = rows[i].dB_from;
                    obj["Windows"][rows[i].WindowName]["db_to"] = rows[i].dB_to;
                    obj["Windows"][rows[i].WindowName]["colors"] = rows[i].WF_colors;
                    obj["Windows"][rows[i].WindowName]["brightness"] = rows[i].brighness;
                    obj["Windows"][rows[i].WindowName]["contrast"] = rows[i].contrast;
                    obj["Windows"][rows[i].WindowName]["wWidth"] = rows[i].wWidth;
                    obj["Windows"][rows[i].WindowName]["wHeight"] = rows[i].wHeight;
                    obj["Windows"][rows[i].WindowName]["wBgColor"] = rows[i].wBgColor;
                } //ende for
                return cb(obj);
            });
        }); //query Grabbers
    });
}

function getGrabberWebsiteSettings(callsign, GrabberName, cb) {
    //at first get the user id by callsign
    connection.query("SELECT * FROM Login WHERE callsign = ? ", [callsign], function(err, rows) {
        var query = "SELECT * FROM Grabbers WHERE UserID = '" + rows[0].id + "' AND GrabberName = '" + GrabberName + "'";
        connection.query(query, function(err, rows) {
            if (err) {
                return console.log(err.message);
            }
            connection.query("SELECT * FROM WebsiteSettings WHERE GrabberID = ?", [rows[0].GrabberID], function(err, rows) {
                var obj = {
                    "MainBgColor": rows[0].BGColor,
                    "GrabberID": GrabberName,
                    "FontFamaly": rows[0].FontFamily,
                    "StreamURL": rows[0].StreamPort
                }
                return cb(obj);
            });
        }); //query Grabbers
    });
}


app.use(bodyParser());
app.use(session({
    secret: "secretCat"
}));
app.use("/grabber/css", express.static(__dirname + "/css"));
app.use("/css", express.static(__dirname + "/css"));
app.use("/img", express.static(__dirname + "/img"));
app.use("/grabber/lib", express.static(__dirname + "/scripts"));


app.get("/", function(req, res) {
    handleDisconnect();
    var html = "";
    if (!req.session.uid) {
        html += "<!DOCTYPE html>";
        html += "<head> <title> Realtime Grabber main page</title></head>";
        html += "<body>";
        html += "<p>Please login to view the links</p>";
        html += '<a href="login">Login</a>';
        html += '</body></html>';
        res.send(html);
    } else { //logged in
        //html+= "<p>Succesfull logged in!</p>";
        //html+= '<p><a href="adim"></a><br>';
        //html+= '<a href="logout">Logout</a></p>';
        var content = null;
        renderPage(content, function(html) {
            res.send(html);
        });
    }
});


app.get("/grabber/grabberData/:route", function(req, res) {
    handleDisconnect();
    var route = req.params.route;
    if (route == "general") {
        getGrabberWebsiteSettings(req.query.callsign, req.query.GrabberName, function(objWebsitesettings) {
            res.header("content-type", "application/json");
            res.header("Charset", "utf8");
            res.send(JSON.stringify(objWebsitesettings));
        });
    }
    if (route == "GrabberSettings") {
        getGrabberSettings(req.query.callsign, req.query.GrabberName, function(GrabberSettings) {
            res.header("content-type", "application/json");
            res.header("Charset", "utf8");
            res.send(JSON.stringify(GrabberSettings));
        });
    }
});


app.post("/login", function(req, res) {
    var userName = req.body.email;
    var pass = req.body.password;

    athenticate(req.body.email, req.body.password, function(err, id, callsign) {
        if (err) {
            modifyLoginForm(err.message, function(err, result) {
                if (err) {
                    res.send(err)
                } else {
                    res.send(result);
                }
            })
        } else {
            if (id) {
                req.session.callsign = callsign;
                req.session.uid = id;
                res.redirect('/');
            } else {
                req.session.error = "Login failed, try again";
                res.redirect('login')
            } //if id
        }
    });
});

app.listen(8000);
Ich kann auch genaustes erklären warum mir das passiert ist. Habe zuletzt an den ganzen ajax requests gearbeitet aber Wochen zuvor hatte ich den Login schon stehen, die Funktion handleDisconnect() hatte ich dann erst eingebaut weil eben das Skript immer abgestürzt ist mit der Meldung Connection lost: The server closed the connection.
Als ich den Login geschrieben habe kam node nicht dazu diese Meldung anzuzeigen, hab's vorher immer beendet.

Bin immer davon ausgegangen das ich die Verbindung nicht zwingend schließen muss.
Kann man das nun eleganter lösen mit dem Login und dem Ajax Requests? Es ist ja nicht gesagt das man nach einem Login auf die Seite geht wo die ajax Requests losgelassen werden.

PS:
xorg1990 schrieb:
Das aller komische ist, dass die Fehlermeldung zyklisch
nee nicht zyklisch sonder nur soft handleDisconnect() aufgerufen wurde:beaten:

@hesst:
http://www.serveridol.com/2012/04/13/mysql-interactive_timeout-vs-wait_timeout/
Cool, das kannte ich noch nicht.
 
Es ist sowieso keine gute Idee, dass connection eine globale Variable ist. Wenn nun zwei Verbindungen gleichzeitig reinkommen, überschreibt sich das.
 
Ja ich weiß, ist aber sowieso noch nicht die Finale Sache, ich möchte nur vor der Silberhochzeit so schnell wie möglich die Webseite zum lauf bringen, damit ich nach der Silberhochzeit in vollen Zügen daran weiter arbeiten kann. Dann erst überlege ich mir das Serverseitige richtig.
 
kkapsner schrieb:
Und wie lang must du noch
So ca. 60 Jahre + sollten es sein ;) Ich bin mit meiner 10 Jahre zsm verheiratet, die Silberhochzeit ist von den Ellis. Da das aber so gut zusammen passt, werden wir alle man nach der großen Feier verreisen, zuvor steht aber erst mal auf den Plan das Grundstück von den Ellis wider auf Vordermann bringen, weil ..... ach was Solls, beenden wir das, sonnst bekomme ich nur ärger
 
Zurück
Oben