Estoy tratando de insertar algo en mi base de datos y luego acceder a él directamente después, pero debido a que el nodo es asíncrono, esto de alguna manera no funciona según lo planeado. Pero sé que debe haber una manera de hacer que esto funcione. Aquí está mi código:
router.post('/anzeigeerstellen', upload_inserat.single('Anzeigebild'), function (req, res) { let titel = req.body.TitelderAnzeige, beschreibung = req.body.Beschreibung, inbild = req.file.filename, ses = req.session; pool.query("INSERT INTO inserat (titel, beschreibung, inseratbildname, email) VALUES (?, ?, ?, ?)", [titel, beschreibung, inbild, ses.email], (error, results, fields) => { pool.query("SELECT iid FROM inserat WHERE titel = ?, beschreibung = ?, inseratbildname = ?, email = ?", [titel, beschreibung, inbild, ses.email], (error, results, fields) => { res.redirect('anzeige?id=' + results[0].iid); }); }); });Y el error es el siguiente:
TypeError: Cannot read properties of undefined (reading '0')
Probé async y await pero no funcionó para mí (y tampoco estoy seguro de si lo usé bien, para ser honesto).
Cada consulta SQL es una promesa, lo que significa que cuando inserta o solicita a la base de datos que obtenga (seleccione) datos para usted, el servidor tarda un tiempo en ejecutar su consulta. Dado que NodeJs tiene una naturaleza sincrónica, ejecuta la siguiente línea del código antes de obtener el resultado de la base de datos. Por lo tanto, tienes undefined .
No entendí muy bien el propósito de la declaración de select , pero si desea saber la id de la fila insertada, el SQL lo devuelve como result .
Entonces, si desea usar javascript de forma asíncrona, la consulta se vería así:
//Setting the route asynchronous router.post('/anzeigeerstellen', upload_inserat.single('Anzeigebild'), async (req, res)=> { let titel = req.body.TitelderAnzeige, beschreibung = req.body.Beschreibung, inbild = req.file.filename, ses = req.session; //Awaiting until the db resolves await pool.query("INSERT INTO inserat (titel, beschreibung, inseratbildname, email) VALUES (?, ?, ?, ?)", [titel, beschreibung, inbild, ses.email], (err, results, fields) => { //Always check if there is an error if (err) console.error(err) else console.log(results) //results should be the id of the row or the row itself /*pool.query("SELECT iid FROM inserat WHERE titel = ?, beschreibung = ?, inseratbildname = ?, email = ?", [titel, beschreibung, inbild, ses.email], (error, results, fields) => { There is no need for this query since the results of the upper query is the row you wanted*/ res.redirect('anzeige?id=' + results[0].iid); //}); }); });