¿Cómo hacer que el repositorio del usuario use la propiedad extendida?

Estoy tratando de hacer un repositorio genérico, estoy usando MongoDB para esto, intenté importarlo y usarlo en otras clases pero no funcionó.

Así que lo que necesito es poner la clase de repositorio disponible a través de toda la aplicación, y todos los datos que necesiten un acceso db deben ser capaces de conectarse con el repositorio.

En este escenario

// userSchema.js
const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  }
});


const User = mongoose.model('User', UserSchema);

module.exports = User;

// repository.js
class Repository {
    constructor(dbCollection) {
      this.dbCollection = dbCollection;
    }

    get(_id) {
        return this.dbCollection.findById({ _id });
    }
}

module.exports = Repository;

// user.repository.js
const Repository = require('./repository');

class UserRepository extends Repository {
  constructor(user) {
    super({
      dbCollection: user
    });
  }
}

module.exports = UserRepository;

// UserController.js

const UserRepository = require('./user.repository.js');

class UserController {
    async find(req, res) {
        const user = await UserRepository.get(req.params.id);
        return res.status(200).json(user);       
    }
}
module.exports = new UserController();

// mongo.js
const mongoose = require('mongoose');

const connectionOptions = {
  useNewUrlParser: true,
  useFindAndModify: false
};

class Database {
  constructor() {
    this.connect();
  }

  connect() {
    return mongoose.connect(process.env.MONGO_URL, connectionOptions);
  }
}

module.exports = new Database();

Traté de hacer algo como:

    const UserRepository = require('./user.repository.js');
    const schemaUser = require('./schemaUser');

    class UserController {
        async find(req, res) {
            const test = new UserRepository(schemaUser)
            const user = await test.get(req.params.id);
            return res.status(200).json(user);       
        }
    }
    module.exports = new UserController();
 

Pero no funcionó.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por binarymaestro


2 Respuestas:

  • El problema en tu código radica en cómo estás importando y utilizando la clase UserRepository en tu UserController. Para hacer que el repositorio del usuario use la propiedad extendida de la clase Repository, puedes corregir tu implementación de la siguiente manera:

    • En UserController.js, debes asegurarte de que estás instanciando correctamente UserRepository y utilizando el método get correctamente:
    javascript
    const UserRepository = require('./user.repository.js');

    class UserController { async find(req, res) { const userRepository = new UserRepository(User); const user = await userRepository.get(req.params.id); return res.status(200).json(user);
    } } module.exports = new UserController();

    • En user.repository.js, ajusta la forma en la que pasas la colección de usuario al padre en la clase UserRepository:
    javascript
    const Repository = require('./repository');
    const User = require('./schemaUser'); // Asumo que tu schema de usuario se llama 'schemaUser'

    class UserRepository extends Repository { constructor() { super(User); } }

    module.exports = UserRepository;

    Con estas correcciones, estás importando correctamente el esquema de usuario (schemaUser) en user.repository.js y en UserController.js, instancias UserRepository con el modelo correcto (User) y usas el método get correctamente.

    Prueba estos ajustes y deberías ser capaz de hacer que el repositorio del usuario use la propiedad extendida. ¡Déjame saber si tienes alguna otra pregunta o problema!

    Respondida el Dec 19, 2020 a las 16:29 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con el código que proporcionaste es que estás intentando pasar el esquema del usuario al repositorio del usuario, pero el repositorio del usuario espera una colección de base de datos, no un esquema. Para resolver este problema, debes crear una instancia del modelo de usuario y pasarlo al repositorio del usuario.

    Aquí tienes un ejemplo de cómo puedes hacer esto:

    javascript
    // UserController.js
    
    const UserRepository = require('./user.repository.js');
    const User = require('./schemaUser.js');
    
    class UserController {
        async find(req, res) {
            const userRepository = new UserRepository(User);
            const user = await userRepository.get(req.params.id);
            return res.status(200).json(user);       
        }
    }
    module.exports = new UserController();
    

    En este código, estamos creando una nueva instancia del modelo de usuario y pasándola al repositorio del usuario. Esto permitirá que el repositorio del usuario acceda a la colección de base de datos del usuario.

    Respondida el Dec 19, 2020 a las 16:30 - por Gemini

    Votos positivos: 0 | Votos negativos: 0