¿Cómo usar las devoluciones de llamada basadas en eventos con consultas mySQL de manera eficiente?

Jacob Simmons

Tuve algunos problemas con las llamadas asíncronas, pero después de comprender un poco mejor las funciones controladas por eventos en Node, tengo el siguiente código. Básicamente hace 2 consultas SQL. El primero comprueba si hay un número de teléfono existente en la tabla. Si lo hay, no pasa nada. Si no lo hay, ejecuta una segunda consulta para agregar un nuevo valor a la tabla.

Actualmente está controlado por eventos, pero ... ¿cómo lo rediseño para que la consulta de la función externa sea una función separada, e incluso pueda usarse como una verificación de validación para el código en otro lugar? (básicamente convirtiéndolo en una función auxiliar genérica)?

router.post('/', function(req, res){
    var mysql = req.app.get('mysql');

    //values for 1st query - initial check
    var customerCheck = "SELECT phone_number FROM customer WHERE phone_number=?";
    var phoneNumberCheck = [req.body.phone_number];

    //values for after 1st query validation passes
    var sql = "INSERT INTO customer (name, phone_number, points, is_activated) VALUES (?,?,?,?)";
    var inserts = [req.body.name, req.body.phone_number, 0, true];

    mysql.pool.query(customerCheck, phoneNumberCheck, function(error, results, fields){
        if(error){
            console.log("Failed to verify!");
            res.write(JSON.stringify(error));
            res.end();
        }else{
            console.log(results);
            if(results.length){
                console.log("phone number exists, not adding.");
                res.redirect('/view_customers');
            }else{
                mysql.pool.query(sql,inserts,function(error, results, fields){
                    if(error){
                        console.log("Failed to insert customer to DB!");
                        res.write(JSON.stringify(error));
                        res.end();
                    }else{
                        res.redirect('/view_customers');
                    }
                });

            }
        }
    });
});
Marcos Casagrande

Aquí hay una forma más organizada de hacerlo, por supuesto que se puede mejorar, pero eso se lo dejo a usted.

Agregué una clase de cliente, donde tienes checky insertfunciones, ahora puedes usarlas individualmente.

Envolví la consulta de la base de datos en una promesa, para evitar el infierno de devolución de llamada ( Aprenda cómo evitarlo aquí )

Finalmente, la función del enrutador se ha vuelto realmente simple y fácil de leer.

customer.js

class Customer {

    constructor(mysql) {
        this.mysql = mysql;
    }

    async check(number) {

        const statement = 'SELECT phone_number FROM customer WHERE phone_number=?';

        const results = await this.query(statement, [number]);

        // If there is a customer with that phone number
        // we return true, false otherwise.
        return results.length;

    }

    insert(name, number) {
        const statement = 'INSERT INTO customer (name, phone_number, points, is_activated) VALUES (?,?,?,?)';

        return this.query(statement, [name, number, 0, true]);

    }

    query(query, placeholders) {
        // We wrap the query in a promise
        // So we can take advantage of async/await in the other functions
        // To make the code easier to read avoiding callback hell
        return new Promise((resolve, reject) => {

            this.mysql.pool.query(query, placeholders, (error, results) => {

                if(error)
                    return reject(error);

                resolve(results);

            });
        });
    }

}

module.exports = Customer;

enrutador

const Customer = require('./customer');

// ... rest of your code

router.post('/', async(req, res) => {

    const customer = new Customer(req.app.get('mysql'));

    try {

        // We check whether the client exists or not
        const check = await customer.check(req.body.phone_number);

        if(!check) // We insert the customer if it doesn't exists
            await customer.insert(req.body.name, req.body.phone_number);

        // After successful insert or if the customer already exists
        // we redirect to /view_customers
        res.redirect('/view_customers');

    } catch(error) {

        // Probably a database error
        console.log('Oops');
        res.write(JSON.stringify(error));
        res.end();
    }

});

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Cómo usar devoluciones de llamada en la función module.export para consultas mysql - nodejs, express

Cómo manejar las devoluciones de llamada asincrónicas de manera sincrónica en Java?

¿Cómo usar las validaciones y devoluciones de llamada de ActiveModel en una clase personalizada?

¿Cómo usar las validaciones y devoluciones de llamada de ActiveModel en una clase personalizada?

Cómo usar variables en Matlab App Designer en todas las devoluciones de llamada

¿Cómo usar devoluciones de llamada y futuros con asyncio y el bucle de eventos PyQt5?

MySQL: ¿Cómo reutilizo de manera eficiente los resultados de una consulta en otras consultas?

¿Cómo reaccionar maneja las funciones / devoluciones de llamada que se pasan a los controladores de eventos?

Manera segura de usar devoluciones de llamada y objetos de montón con P / Invoke

Ejecute devoluciones de llamada basadas en Java Flyway con Spring Boot

Usar devoluciones de llamada en el módulo de mouse de Python (recuperar tipos de eventos)

Cgo: no puedo encontrar la manera de usar devoluciones de llamada con el argumento const char *

Manera correcta de usar devoluciones de llamada de FadeOut

Devoluciones de llamada en C ++

Comprender las devoluciones de llamada en NodeJS

¿Cómo manejar con gracia las devoluciones de llamada de C desde el código C ++?

¿Cómo funcionan las consultas de medios CSS basadas en píxeles con los teléfonos inteligentes modernos?

¿En qué fase del bucle de eventos de Nodejs se ejecutan las devoluciones de llamada de las promesas resueltas?

¿Cómo estructurar las devoluciones de llamada de JavaScript en una cadena de funciones dependientes?

¿Cuáles son las ventajas de usar devoluciones de llamada sobre cadenas para encapsular código en javascript?

Cómo deshacerse de la redundancia en una tabla mysql con listas de manera eficiente

¿Cómo debo definir las devoluciones de llamada con $ http cuando uso Typecript?

Deslizadores dependientes con Bokeh, cómo escribir las devoluciones de llamada

¿Hay devoluciones de llamada de eventos en BBC MicroPython?

Compartir variables entre devoluciones de llamada de eventos en NodeJS

¿Cómo seleccionar de manera eficiente filas NO NULAS, NO VACÍAS basadas en múltiples columnas?

¿Cómo funcionan realmente las devoluciones de llamada de ActiveRecord en rieles?

¿Cómo eliminar las devoluciones de llamada de suscripción en redis?

¿Cómo migrar de manera eficiente las consultas EF linq a Dapper?

TOP Lista

CalienteEtiquetas

Archivo