es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

JS await no está funcionando como se esperaba con la consulta de pg

Quiero utilizar el resultado de una consulta a una base de datos postgresSQL. No quiero simplemente imprimirlo, sino que quiero usarlo en otra función. El problema es que la función aquí devuelve antes de terminar la ejecución del código.
“`
async function create<em>base</em>config(user<em>id, service</em>id, timer<em>seconds) {
var ret
var line
await db</em>adm<em>conn.query(<code>
INSERT INTO base_config (user_id, service_id, timer_seconds)
VALUES ('</code> + user</em>id + "', '" + service<em>id + "', '" + timer</em>seconds + "') RETURNING id;", (err, result) => {
if (err) {
ret = false
line = err
console.log("line2 err : " + line)

<pre><code> }
else {
ret = true
line = result.rows
console.log("line2 : " + line)
// json_return = JSON.parse(result)
// console.log(result.rows)

}
});
console.log("line: " + line)
return { ret_value: ret, line_value: line };
</code></pre>

}
<code>
Para probarlo, inserté impresiones de depuración. La salida es:
</code>
server<em>1 | line: undefined
server</em>1 | line2 : [object Object]

“`
Entonces, estoy ejecutando el código después del await antes de que el await haya terminado. ¿Cómo puedo solucionarlo para que primero ejecute todo el código del await y luego el resto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarse de que la función espere a que la consulta termine de ejecutarse antes de retornar, debería mover la función de retrollamada de la consulta dentro de la declaración await. Aquí está la versión actualizada del código:

    async function create_base_config(user_id, service_id, timer_seconds) {
        try {
            const result = await db_adm_conn.query(`
                INSERT INTO base_config (user_id, service_id, timer_seconds)
                VALUES ($1, $2, $3) RETURNING id;
            `, [user_id, service_id, timer_seconds]);
    
            return { ret_value: true, line_value: result.rows };
        } catch (err) {
            console.log('Error:', err);
            return { ret_value: false, line_value: err };
        }
    }
    

    En lugar de utilizar una retrollamada, este código utiliza la palabra clave await para esperar el resultado de la consulta que se va a devolver. El resto de la función está envuelta en un bloque try...catch para manejar cualquier error que pueda ocurrir durante la consulta.

    Al devolver un objeto con el estado de éxito (ret_value) y el resultado de la consulta (line_value), puede utilizar la salida de esta función en otra función.

Comments are closed.