Tengo una pregunta. Estoy usando una aplicación NodeJS dividida en tres partes principales
Objeto de acceso a datos Aquí, creé una función que hace la interacción directa con la base de datos solo en este archivo.
const { respuesta } = require('expreso'); const db = require('../conexión/db.js');
/* Exportar */ module.exports = { // Insertar usuario insertUser: (parámetros) => { const sqlStatement = '¿INSERTAR EN EL CONJUNTO de usuarios?'; devolver nueva promesa ((resolver, rechazar) => { db.query(sqlStatement, parámetros, (error, respuesta) => { if (error) { devolver rechazar (error); } devolver resolver (respuesta); }) }) } }
Clase de objeto En esta clase, haré la validación y crearé el método con argumentos, luego implementaré el objeto de acceso a datos insertUser
.
const db = require('../dataAccessObject/dao.js');
class User { constructor (fname, lname, edad, correo electrónico, contraseña, avatar, género) { this.fname = fname; this.lname = lname; esta.edad = edad; este.email = correo electrónico; this.contraseña = contraseña; este.avatar = avatar; this.género = género; }
/* Methods */ createUser() { db.insertUser({ 'firstName' : this.fname, 'lastName' : this.lname, 'age' : this.age, 'email' : this.email, 'password' : this.password, 'userAvatar' : this.avatar, 'gender' : this.gender }) .then(() => { console.log(this); return this; }) .catch(error => { if (error.code == 'ER_DUP_ENTRY' && error.errno === 1062) throw new Error('This email is allready in use') else throw error; }) } /* Validations */
}
módulo.exportaciones = Usuario;
Controlador
const nuevoUsuario = nuevo Usuario("fname", "lname", 22, "ema2121il", "contraseña", "avatar", "género"); nuevoUsuario.createUser(); res.send(nuevoUsuario)
Necesito encontrar una manera de pasar los errores de validación o el error duplicado del punto 2 (clase de objeto) al controlador.
Por favor, ¿cómo puedo hacer esto?
Entonces, si su objetivo es devolver datos al controlador expreso (de la clase). La mejor manera es utilizar la biblioteca Promise. Entonces su función createUser
debería verse así:
createUser() { return new Promise ((resolve, reject) => { db.insertUser({ 'firstName' : this.fname, 'lastName' : this.lname, 'age' : this.age, 'email' : this.email, 'password' : this.password, 'userAvatar' : this.avatar, 'gender' : this.gender }) .then(() => { console.log(this); this.runValidations() return resolve(this); }) .catch(error => { if (error.code == 'ER_DUP_ENTRY' && error.errno === 1062) { return reject('This email is already in use') } else { return reject(); } }) }); }
Luego, para utilizarlo desde su controlador, utilice async/await para utilizar el método.
//The Controller Code app.get('/create-user', async(req, res) => { const user = new User(req.body) // Assuming this is how you're instantiating class try { const newUser = await user.createUser(); console.log("User is Created"); } catch (err) { //Your Error will be available here. console.log("Your Error: ", err) } })
Esto debería darte lo que necesitas :)