Escribí una función para crear un perfil de usuario.
Uso el módulo de sincronización para deshacerme del infierno de devolución de llamada.
Cuando hago esto, todo funciona bien:
var sql = jsonSql.build({ type: 'insert', table: 'tbl_user', values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: data.hashedPassword}, }); try { var query = sync.await(db.query(sql.query, sql.values, sync.defer())); } catch (err) { res.status(500).send(err); return; }Cuando sql encuentra un usuario con una dirección de correo ya utilizada, envía un error. Perfecto.
Entonces pensé que sería una buena idea separar el código donde se escribe el usuario en la base de datos, porque tal vez desee crear un usuario en el backend de administración y luego podría reutilizar la función más pequeña.
La función más pequeña:
function createUserInDB(data) { var sql = jsonSql.build({ type: 'insert', table: 'tbl_user', values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: data.hashedPassword}, }); return db.query(sql.query, sql.values); }Que ahora se llama desde la función principal:
try { var query = sync.await(userService.createUserInDB(data, sync.defer())); console.dir(query); } catch(err) { console.dir(err); res.status(500).send(err); return; }Esto no funciona.
¿Cómo puedo obtener el resultado de la función más pequeña (como resultado de error o consulta) en mi función principal, para poder usar try / catch?
Finalmente lo resolví.
function createUserInDB(data, resolve) { sync.fiber(function() { data.hashedPassword = bcrypt.hashSync(data.password, 10); var sql = jsonSql.build({ type: 'insert', table: 'tbl_user', values: {firstname: data.firstname, lastname: data.lastname, email: data.email, website: data.website, password: data.hashedPassword}, }); try { var query = sync.await(db.query(sql.query, sql.values, sync.defer())); //first argument would be error resolve(null, query); } catch(err) { resolve(err); } }); }Básicamente, agregue la función de devolución de llamada al parámetro de función y luego resuélvalo dentro de la fibra.