Acabo de empezar a aprender Node.js/Express y todavía tengo dificultades con las funciones de Asynch. Hice algunas funciones para interactuar con una base de datos postgresql (con algunos tutoriales), y la selección de filas de los datos va bien, pero por alguna razón algo está pasando con la eliminación de las filas. Aquí hay un ejemplo de una función que va bien:
const getPlayers = () => { return new Promise(function(resolve, reject) { pool.query('SELECT * FROM Players ORDER BY p_id ASC', (error, results) => { if (error) { reject(error) } resolve(results.rows); }) }) }Ahora la siguiente función no va bien. Console.log(id) da el número correcto, pero parece que la identificación no está definida al ejecutar la consulta y sospecho que tiene que ver con Asynch/synch. Ahora Asynch es nuevo para mí, por lo que tampoco soy un experto en lo que va mal. Aquí está la función que no va bien:
const deletePlayer = (id) => { return new Promise(function(resolve, reject) { pool.query('DELETE FROM Players WHERE player_id = ?' , [id], (error,results) => { if (error) { reject(error) } resolve(`Player deleted with ID: ${id}`) }) }) }La llamada a la función:
app.delete('/laProjects/:id', (req, res) => { players_model.deletePlayers(req.params.id) .then(response => { res.status(200).send(response); }) .catch(error => { res.status(500).send(error); }) })No asuma automáticamente que se trata de un problema asíncrono. Primero intente algunos pasos simples de console.log:
const deletePlayer = (id) => { console.log("Started deletePlayer with id: ",id) /////////// return new Promise(function(resolve, reject) { console.log("Inside the promise, id is the same, namely: ",id) /////////// pool.query('DELETE FROM Players WHERE player_id = ?' , [id], (error,results) => { if (error) { reject(error) } resolve(`Player deleted with ID: ${id}`) }) }) } Si no ve ningún mensaje de console.log impreso, tal vez, como sugiere @ steve16351, está editando deletePlayer pero en realidad está llamando a otra función deletePlayers .
Cuando Promises llegó por primera vez a Javascript, eran la herramienta práctica para la programación asincrónica, por lo que la gente a veces usaba el término "asincrónico" para referirse a ellos en el habla.
Sin embargo, dado que llegó la palabra clave async , es mejor no usar la palabra "async" para cosas que no son esa palabra clave.
Código de bloqueo : un programa que simplemente espera (evitando que se ejecute cualquier otro código) mientras ocurre algún proceso externo.
Callbacks : la forma más antigua de programación asíncrona en JS. Le dices a JS que ejecute una determinada función solo después de que haya ocurrido algún evento externo.
Promesas : una forma más conveniente y legible de lograr el mismo efecto que las devoluciones de llamada. Puede imaginar que el proceso se construye a partir de devoluciones de llamada ocultas.
palabra clave async : una forma aún más conveniente y legible de lograr los mismos efectos que las devoluciones de llamada y las promesas. Está hecho implícitamente de promesas, aunque lo protege de tener que pensar en cómo construir una nueva promesa.
Esto nos dice que su suposición original, que el error se debe a que una variable no está definida, es incorrecta. id tiene el valor esperado.
Por lo tanto, el error es que la API está dando un error en respuesta a esta llamada:
pool.query( 'DELETE FROM Players WHERE player_id = ?' , [5], (error,results) => { if (error) { reject(error) } else { resolve(`Player deleted with ID: ${id}`); } } )Entonces, ¿por qué no ejecuta exactamente eso, en forma simplificada como esta?
pool.query( 'DELETE FROM Players WHERE player_id = ?' , [5], (error,results) => { console.log("Error:",JSON.stringify(error,null,2),"Results:",JSON.stringify(error,null,2)) } ) Esto envía una solicitud explícita a pool.query y revela explícitamente el resultado. No sé el formato que espera la API pool.query : ¿tal vez no sea del todo correcto?