¿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.
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.
Hay dos puntos equivocados:
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'); });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") } } }); }) }