Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

177
Vistas
Solicitud de mangosta síncrona

¿Es posible procesar una consulta db.model.find() dentro del contexto de la función y recuperar un resultado sin usar devoluciones de llamada y promesas con la biblioteca mongoose?

Necesito estar seguro, si existe algún usuario en el proceso de ejecutar el controlador, por lo tanto, no puedo minimizar el alcance actual para devolver la llamada debido a la gran cantidad de operaciones (por ejemplo, comunicación con la base de datos). También estoy tratando de realizar el modelo MVC en mi proyecto, por lo tanto, quiero mantener las bibliotecas auxiliares (módulos) en archivos separados. Es por eso que no quiero usar devoluciones de llamada o promesas; muchas veces complicarán todo aún más de lo que ya lo hacen.


Por ejemplo, ¿cómo debo reescribir el siguiente código para que se ejecute con éxito (si es realmente posible) (puede ignorar el modelo de inicio de sesión y el controlador ; están escritos para representar una complicación si reescribo ese código usando devoluciones de llamada):

usuario.js lib

 var db = require('./lib/db'); class User{ constructor(id){ //get user by id var result = db.models.user.findOne({_id: id}); //unsupported syntax in real :( if(!result || result._id != _id) return false; else{ this.userInfo = result; return result; } } } module.exports = User;

modelo de inicio de sesión

 var user = require('./lib/user') var model = {}; model.checkUserLogged(function(req){ if(!req.user.id || req.user.id == undefined) return false; if(!(this.user = new user(req.user.id))) return false; else return true; }); module.exports = model;

controlador de inicio de sesión

 var proxy = require('express').router(); proxy.all('/login', function(req, res){ var model = require('./models/login'); if(!model.checkUserLogged()){ console.log('User is not logged in!'); res.render('unlogged', model); }else{ console.log('User exists in database!'); res.render('logged_in', model); } });

Las funciones/rendimientos del generador, async/await ( es2017 ), y todo lo demás, se pueden usar solo para resolver el problema sin anidar.

Gracias por adelantado.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Hay dos puntos equivocados:

  • Los métodos Mongoose no se pueden llamar de forma síncrona (de todos modos, una llamada a una base de datos realizada de forma síncrona no es una buena idea en absoluto).
  • No se pueden usar async/await ni generadores en el constructor de una clase ES6. Está explicado en esta respuesta .

Si no desea un código anidado, una opción fácil podría ser usar async/await (actualmente disponible en Node.js usando un indicador, no recomendado para producción). Dado que los métodos Mongoose devuelven promesas, se pueden usar con async/await.

Pero como dije, no puedes hacer eso en el constructor, por lo que tiene que estar en otro lugar.

Como ejemplo podrías hacer algo como esto:

 var proxy = require('express').router(); var db = require('./lib/db'); proxy.all('/login', async function(req, res){ const result = await db.models.user.findOne({_id: req.user.id}).exec(); if (!result) { console.log('User is not logged in!'); return res.render('unlogged'); } res.render('logged_in'); });
over 4 years ago · Santiago Trujillo Denunciar

0

Pregunta anterior, pero quiero compartir un método para manejar esto que no vi en mis primeras dos búsquedas.

Quiero obtener datos de un modelo, ejecutar alguna lógica y devolver los resultados de esa lógica. Necesito un envoltorio de promesa en torno a mi llamada al modelo.

A continuación se muestra una función ligeramente resumida que toma un modelo para ejecutar una consulta mongoose/mongo y un par de parámetros para ayudarlo a hacer algo de lógica. Luego devuelve el valor que se espera en la promesa o lo rechaza.

 export function promiseFunction(aField: string, aValue, model: Model<ADocument, {}>): Promise<aType> { return new Promise<string>((resolve, reject) => { model.findOne({[aField]: aValue}, (err, theDocument) => { if(err){ reject(err.toString()); } else { if(theDocument.someCheck === true){ return(theDocument.matchingTypeField) } else { reject("there was an error of some type") } } }); }) }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda