Выполнение нескольких запросов в nodejs mysql async / await - PullRequest
0 голосов
/ 27 апреля 2020

Я новичок в nodejs. Я хочу выполнить несколько запросов в функции, которая зависит друг от друга.

pool.getConnection((err, connection) => {
        let productDetailsQuery = "select * from products where id = ?";
        connection.query(productDetailsQuery, [event.product_id], (error, products) => {
            if (products.length) {
                connection.query("select * from galleries where product_id = ?", [products[0].id], (err, galleries ) => {
                    products[0].customAttributes = galleries ;
                });
                connection.query("select * from custom_attributes where product_id = ?", [products[0].id], (err, custom_attributes) => {
                    products[0].customAttributes = custom_attributes;
                });
                connection.query("select * from sizes where product_id = ?", [products[0].id], (err, sizes ) => {
                    products[0].sizes= sizes;
                });

                .............................
                //more queries to run here and to append to products result.
                ................................

                console.log({
                    status: true,
                    message: "Product found.",
                    data: products
                })
            } else {
                console.log({
                    status: false,
                    message: "Products is not found",
                    data: [
                        "Product is not found for id : " + event.product_id
                    ]
                })
            }
        });
    })

Когда я консоль своих продуктов, он показывает только первый запрос ie результат. это не показывает результат внутреннего запроса ie. если я утешу внутренние запросы, я могу получить желаемый результат.

Пожалуйста, помогите мне добиться этого.

Спасибо в advacne.

Мой желаемый результат -

{ 
 status:true,
 message : "product found",
 data : [{
     "id" :12,
     "product_name":"bat",
     "galleries": [......],
     "customAttributes":[.......',
     "sizes":[..........]
 }]

}

ПРИМЕЧАНИЕ: Я НЕ ХОЧУ ЗАПУСТИТЬ ЗАПРОСЫ В ЗВОНЕ ОДНОГО ДРУГОГО

Ответы [ 3 ]

0 голосов
/ 27 апреля 2020

Попробуйте это

const util = require('util');

pool.getConnection(async (err, connection) => {

    connection.query = util.promisify(connection.query);

    let productDetailsQuery = "select * from products where id = ?";
    let products = await onnection.query(productDetailsQuery, [event.product_id]);
    if (products.length) {
        let galleries = await connection.query("select * from galleries where product_id = ?", [products[0].id]);
        products[0].customAttributes = galleries;

        let custom_attributes = await connection.query("select * from custom_attributes where product_id = ?", [products[0].id]);
        products[0].customAttributes = custom_attributes;

        let sizes = await connection.query("select * from sizes where product_id = ?", [products[0].id]);
        products[0].sizes = sizes;

        //.............................
        //more queries to run here and to append to products result.
        //................................

        console.log({
            status: true,
            message: "Product found.",
            data: products
        })
    } else {
        console.log({
            status: false,
            message: "Products is not found",
            data: [
                "Product is not found for id : " + event.product_id
            ]
        })
    }
})
0 голосов
/ 27 апреля 2020

Это из-за асинхронного c поведения вашего кода, есть несколько способов справиться с ним 1) обратный вызов -> мне это не нравится 2) асин c -wait

мы можете написать этот код таким образом

pool.getConnection(async (err, connection) => {
        let productDetailsQuery = "select * from products where id = ?";
        let products = await executeQuery(connection,productDetailsQuery, [event.product_id]);            
    if (products.length) {

                .............................
                   //more queries to run here and to append to products result.
                ................................

                console.log({
                    status: true,
                    message: "Product found.",
                    data: products
                })
            } else {
                console.log({
                    status: false,
                    message: "Products is not found",
                    data: [
                        "Product is not found for id : " + event.product_id
                    ]
                })
            }
        });
    });

async function executeQuery(connection, query, parameters) {
   return new Promise((resolve, reject) => {
       connection.query(query, parameters, (error, response) 
       => {
            if(error) return reject(error);
            return resolve(response);
       })
   })
}


0 голосов
/ 27 апреля 2020

Я получил один ответ, я не уверен, насколько это правильно. любой может просмотреть мой ответ и сообщить свои исправления. Спасибо. Ответ:

pool.getConnection((err, connection) => {
        let productDetailsQuery = "select * from products where id = ?";
        connection.query(productDetailsQuery, [event.product_id],async  (error, products) => {
            if (products.length) {
                sql = "select * from custom_attributes where product_id = ?";
                args = [products[0].id];
                await util.promisify( connection.query ).call( connection, sql, args ).then((custom_attributes)=>{
                    products[0].customAttributes = custom_attributes;
                });

                sql = "select * from galleries where product_id = ?";
                args = [products[0].id];
                await util.promisify( connection.query ).call( connection, sql, args ).then((galleries)=>{
                    products[0].galleries = galleries;
                });

                sql = "select * from ratings where product_id = ?";
                args = [products[0].id];
                await util.promisify( connection.query ).call( connection, sql, args ).then((ratings)=>{
                    products[0].ratings = ratings;
                });

                sql = "select * from comments where product_id = ?";
                args = [products[0].id];
                await util.promisify( connection.query ).call( connection, sql, args ).then((comments)=>{
                    products[0].comments = comments;
                });
                console.log({
                    status: true,
                    message: "Product found.",
                    data: products[0]
                })
                process.exit()
            } else {
                console.log({
                    status: false,
                    message: "Products is not found",
                    data: [
                        "Product is not found for id : " + event.product_id
                    ]
                })
            }
        });
    })

Необходимо импортировать

const util = require('util');
...