Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

288
Views
Mongoose y Next.js: error de tiempo de ejecución no controlado TypeError: no se pueden leer las propiedades de undefined (leyendo 'Token')

Básicamente definí este modelo, como otro que no da error; Así que estoy perplejo en cuanto a por qué no está funcionando ...

Aquí hay un ejemplo mínimo y reproducible

No funciona:

 import mongoose from 'mongoose'; const TokenSchema = new mongoose.Schema({ _userId: { type: mongoose.Schema.Types.ObjectId, required: true, ref: 'User' }, token: { type: String, required: true }, createdAt: { type: Date, required: true, default: Date.now, expires: 43200 } }); export default mongoose.models.Token || mongoose.model('Token', TokenSchema);

Laboral:

 import mongoose from 'mongoose'; import emailValidator from 'email-validator' import bcrypt from 'bcrypt' import crypto from 'crypto' const SALT_ROUNDS = 12; const UserSchema = new mongoose.Schema( { username: { type: String, required: true, trim: true, lowercase: true, index: { unique: true }, validate: { validator: emailValidator.validate, message: props => `${props.value} is not a valid email address!` } }, password: { type: String, required: true, trim: true, index: { unique: true }, minlength: 7, maxlength: 11 }, roles: [{ type: 'String' }], isVerified: { type: Boolean, default: false }, passwordResetToken: String, resetPasswordExpires: Date }, { timestamps: true } ); UserSchema.pre('save', async function preSave(next) { const user = this; if (!user.isModified('password')) return next(); try { const hash = await bcrypt.hash(user.password, SALT_ROUNDS); user.password = hash; return next(); } catch (err) { return next(err); } }); UserSchema.methods.generatePasswordReset = function () { this.resetPasswordToken = crypto .randomBytes(20) .toString('hex'); this.resetPasswordExpires = Date.now() + 3600000; // expires in an hour }; UserSchema.methods.comparePassword = async function comparePassword(candidate) { return bcrypt.compare(candidate, this.password); }; export default mongoose.models.User || mongoose.model('User', UserSchema)

También estoy siguiendo este ejemplo en el repositorio de ejemplos de Next.js.

¡Por favor ayuda! :)

about 4 years ago · Juan Pablo Isaza
3 answers
Answer question

0

Aparentemente TypeError: Cannot read properties of undefined (reading 'Token') está ocurriendo porque el código se está ejecutando en el lado del cliente cuando está destinado a ejecutarse en el lado del servidor.

Lo que realmente sucede es que mongoose no ha iniciado una conexión con la base de datos, por lo que mongoose.models no está definido. Pero la solución no es intentar iniciar una conexión db:

Yo también estaba teniendo un problema similar, cuando traté de definir demasiadas cosas en el mismo archivo, eso es... En mi caso, estoy tratando de definir interfaces de TypeScript que se pueden incorporar al código del lado del cliente, pero el Las definiciones del modelo mongoose terminan ejecutándose también...

Leí que NextJS hace bastante trabajo para dividir el código que se envía al lado del cliente y lo que permanece en el lado del servidor... El desarrollador debe tener esto en cuenta y tratar de dividir las cosas que se relacionan con el lado del cliente y del lado del servidor en diferentes archivos.

En mi caso, coloqué las definiciones de interfaz y mis Hooks personalizados en un archivo diferente de las definiciones de Mongoose Schema; y luego importé solo las interfaces y los ganchos cuando los necesitaba, lo que hizo que los errores desaparecieran.

Intentar mantener todo en el mismo lugar suena lógico y ordenado, pero no funciona en este caso.

about 4 years ago · Juan Pablo Isaza Report

0

Copié su código y funcionó bien (entró en las colecciones de tokens versus el token como se esperaba posiblemente) una cosa que noté fue que el campo expires en createdAt : ¿era este un campo NextJS? No es un campo predeterminado, así que solo es curioso. Además, ¿puede pegar el error exacto que está encontrando? Esto ayudará a alguien a rastrear el problema.

 { _userId: new ObjectId("5e1a0651741b255ddda996c4"), token: 'abcd123', createdAt: 2021-09-24T23:10:24.288Z, _id: new ObjectId("614e5ae04c741f91ac062530"), __v: 0 }

Además, considere usar la propiedad de opciones de marcas de tiempo cuando declare el modelo, ya que esto le ahorrará el dolor de cabeza de configurar createdAt up (y también puede hacer que updatedAt se actualice automáticamente).

 token: { type: String, required: true }, }, { timestamps: true } );
about 4 years ago · Juan Pablo Isaza Report

0

Yo tenía el mismo error. Aunque mi archivo de esquema era correcto. el problema fue por alguna razón, he estado importando el modelo en el archivo del componente de reacción

 import room from "../models/room";
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!