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! :)
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.
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 } );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";