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');
}
});
}
}
});
});
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 check
y insert
funciones, 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
Déjame decir algunas palabras