MySQL-Fehlermeldung an Applikation durchreichen [MySQL, Node, Express, Cors, JS, HTML]

jemand anders

Erfahrenes Mitglied
Hallo,

in der CRUD-Anwendung werden Artikel in einer MySQL-Datenbank im Zusammenspiel mit Node verwaltet.

Im Moment schmiert die App auf Node ab, wenn ein DB-Fehler auftritt. Wenn man keine Browser-Dev-Konsole offen hat, bekommt man es nicht mit. Checks in der HTML-Anwendung, damit so etwas möglichst nicht passiert, kommen noch.

Es geht mir generell darum, dass man eine detaillierte Fehlermeldung bekommt, wenn ein DB-Fehler auftritt. Wie reicht man die DB-Fehlermeldung an die Anwendung durch?

Es dürfte keine Möglichkeit geben, ein generelles Abschmieren zu verhindern, aber wie kann man es möglichst minimieren? Wie gesagt, die Eingabechecks kommen noch. Vermutlich sollte die Node-App ebenfalls entsprechenden Code enthalten, falls jemand die HTML-Anwendung umgeht. Gibt es irgendwelche Standards, die bereits irgendwo niedergeschrieben sind?

Grüße

PS: mysql Ver 15.1 Distrib 10.5.16-MariaDB, for Linux (x86_64) using EditLine wrapper


Der relevante Code:

Code:
Node-App:
app.post('/api/artikel', (req, res) => {
    let data = {
        nummer: req.body.nummer
    }
    let sql = "INSERT INTO artikel SET ?"
    conexion.query(sql, data, function(err, result) {
        if(err) {
            throw err
        } else {
            Object.assign(data, {
                id: result.insertId
            })
            res.send(data)
        }
    })
})

JS-Code in HTML-Anwendung:
artikelForm.addEventListener('submit', (e) => {
    e.preventDefault()
    if(option == 'insert') {
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({
                bez: bez.value
            })
        }).then(response => response.json()).then(data => {
            const neuerArtikel = []
            neuerArtikel.push(data)
            show(neuerArtikel)
        }).catch(error => console.log(error));
    }
})
  
--- 
  
Fehlermeldung Firefox Dev-Tool:

Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource.

---

Fehlermeldung von MySql:
  
node_modules/mysql/lib/protocol/Parser.js:437
      throw err; // Rethrow non-MySQL errors
      ^

Error: ER_WARN_DATA_OUT_OF_RANGE: Out of range value for column 'precio' at row 1
    … {
  code: 'ER_WARN_DATA_OUT_OF_RANGE',
  errno: 1264,
  sqlMessage: "Out of range value for column 'nummer' at row 1",
  sqlState: '22003',
  index: 0,
  sql: "INSERT INTO artikel SET `nummer` = '111111111111111111111111111111'"
}
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Du schreibst nicht welche MySQL-Version.
Ich geh mal von MySQL8 aus: MySQL :: MySQL 8.0 Reference Manual :: 13.6.7.5 SIGNAL Statement
The error values that are accessible after SIGNAL executes are the SQLSTATE value raised by the SIGNAL statement and the MESSAGE_TEXT and MYSQL_ERRNO items. These values are available from the C API:

Schau mal nach, ob Javascript/Ajax dir bindings für die 3 Funktionen anbietet.
 

Zvoni

Erfahrenes Mitglied
Yo, für MariaDb sind es dieselben Funktion
erster check ob mysql_errno 0 zurückgibt (kein Fehler), sonst rufe mysql_sqlstate bzw. mysql_error auf
 

jemand anders

Erfahrenes Mitglied
Ich habe mich jetzt so entschieden, dass die App abhängig vom Fehler weiterlaufen lasse oder stoppe und ggf. eine Meldung im Browser bringe. Wenn ich es soweit habe, werde ich es hier einstellen.