Quiero hacer 2 consultas MySQL a partir de una solicitud GET, unir los resultados y devolverlos. Pero tengo dificultades para pasar el resultado de la primera consulta al siguiente bloque ().

const express = require('express');
const router = express.Router();
const axios = require('axios');
const con = require('../../db');

router.get('/:id', (req, res, next) => {
axios.get('/').then(docs => { //get one book by its id number
    const sql = "SELECT title, line, mage_edition FROM books WHERE id=" + req.params.id;
    con.query(sql, (err, result) => {
        if (err) {
            throw err;
        }
        return result; //"result" shows proper value here
    });
}).then(docs => { //get all the listings that appear inside that book
    //How do I get "result" here?
    const sql2 = "SELECT l.entry_id, e.title, e.kind, e.sort FROM links l INNER JOIN entries e ON l.entry_id = e.id WHERE book_id=" + req.params.id;
    con.query(sql2, (err, result2) => {
        if (err) {
            throw err;
        }
        //combine result and result2, then give back with res.status(200).json()
    })
});
});
module.exports = router;

Cualquier ayuda sería muy apreciada. Terminé una serie de videos de capacitación en JavaScript asincrónico, pero no puedo entenderlo.

0
Tachyon80 28 oct. 2019 a las 16:22

3 respuestas

La mejor respuesta

El problema es que su llamada de consulta no devuelve una promesa, solo llama a la devolución de llamada cuando termina. Si cualquier biblioteca de base de datos que está utilizando no admite promesas de devolución, sugeriría crear funciones de contenedor para sus métodos de consulta que en su lugar devuelvan una promesa. Hará que encadenarlos en promesas sea mucho más fácil.

Algo como esto:

function queryPromise(con, sql) {
    return new Promise((resolve, reject) => {
      con.query(sql, (err, result) => {
        if (err) { return reject(err); }
        return resolve(result);
      });
    });
}
2
IceMetalPunk 28 oct. 2019 a las 13:27

Use la palabra clave return para devolver el resultado dentro del bloque then(). Estos deberían ser los datos disponibles para el siguiente bloque.

Tenga en cuenta que si necesita una ejecución en orden de los bloques de entonces, deberá devolver una Promesa en lugar de valores resueltos

0
Samuel_NET 28 oct. 2019 a las 13:27

Para volver de una .then a la siguiente .then, debe devolver el valor de previous entonces. Su código no funciona porque está devolviendo el resultado de una función de devolución de llamada. No puede devolver el valor de la función de devolución de llamada.

Compruebe si su función .query devuelve alguna promesa o no. En caso afirmativo, debe hacer algo como esto const result = awati con.query(sql);.

O bien, puede prometer su función .query y luego esperarla.

0
Dijkstra 28 oct. 2019 a las 13:37