Estoy trabajando en una aplicación next.js y me gustaría mover el código que interactúa con la base de datos fuera de la API. Creé una clase que sería mi administrador:
class UserManager { async findUser(email) { //some code return user; } async updateUser(user, reqBody) { //some other code //return something } } module.exports = UserManager;y estoy tratando de usar esta clase desde mi api
const UserManager = require('../../manager/UserManager'); export default async (req, res) => { const email = session.user.email; let UserManager = new UserManager(); const user = await UserManager.findUser(email); }y estoy recibiendo este error
| ReferenceError: Cannot access 'UserManager1' before initialization | 10 | } | 11 | const email = session.user.email; | > 12 | let UserManager = new UserManager(); | | ^¿Qué tiene de malo este enfoque? ¿Estoy solicitando la clase de manera incorrecta?
Esto no tiene nada que ver con módulos o requre . Solo variables y alcance.
Tiene dos variables llamadas UserManager .
Uno es una const y está en el ámbito del módulo y contiene la clase.
El otro es un let que tiene como alcance la función de flecha exportada; sombrea la const .
Está tratando de leer la const dentro de la función pero está sombreada por let . Dado que está tratando de leer la const primero (para llamar a una función para obtener el valor para asignar a let ), obtiene un error porque las reglas de JS dicen que está leyendo let (no la const que desea).
Cambia el nombre de la variable que usas para let .
Idiomatic JS reserva nombres de variables que comienzan con una letra mayúscula para clases y funciones de constructor (y React.js agrega componentes a esa lista). A la variable let se le asigna una instancia de una clase, no la clase en sí, por lo que su nombre no debe comenzar con una letra mayúscula.
let userManager = new UserManager(); Recomiendo usar la regla no-shadow eslint para alertarlo cuando cometa este error.
Aparte: su clase no parece rastrear ningún estado interno, solo se usa para crear un objeto para agrupar algunos métodos (ninguno de los cuales hace uso de this ). Probablemente sería mejor como un objeto simple en lugar de una clase.