Inyección de dependencia de modelos Nest.js con Mongoose sin constructor
Necesito integrar una API de CRM con mi servicio en Nest.js. Desafortunadamente, requieren que implemente su interfaz para usar una capa de persistencia personalizada, en mi caso, Mongo. Dado que necesito instanciar la clase resultante, no puedo inyectar el modelo como normalmente lo haría, así que intenté usar esto en la variable miembro de la clase en su lugar. Sin embargo, esto resulta en un error que indica que la variable miembro no está definida.
Este es mi modelo Mongoose:
export type ZohoTokenDocument = ZohoToken & Document;
@Schema({ timestamps: true })
export class ZohoToken {
@Prop()
name: string;
@Prop({ type: String, length: 255, unique: true })
user_mail: string;
@Prop({ type: String, length: 255, unique: true })
client_id: string;
@Prop({ type: String, length: 255 })
refresh_token: string;
@Prop({ type: String, length: 255 })
access_token: string;
@Prop({ type: String, length: 255 })
grant_token: string;
@Prop({ type: String, length: 20 })
expiry_time: string;
}
export const ZohoTokenSchema = SchemaFactory.createForClass(ZohoToken);
Esta es la clase personalizada que estoy creando según lo requerido por la API de terceros:
export class ZohoStore implements TokenStore {
@InjectModel(ZohoToken.name)
private readonly tokenModel: Model<zohotokendocument>;
async getToken(user, token): Promise<any> {
const result = await this.tokenModel.findOne({ grant_token: token });
return result;
}
...
Y en mi servicio, simplemente estoy instanciando esta clase como new ZohoStore()
, lo cual funciona bien hasta que se llama al método getToken()
más tarde.
El error resultante es: "TypeError: Cannot read property 'findOne' of undefined"
, lo que significa que el tokenModel
no se está instanciando. ¿Alguna idea de cómo puedo inyectar mi modelo en esta clase sin colocarlo en el constructor? De lo contrario, no puedo instanciarlo con un constructor sin argumentos desde mi servicio.
davy.ai
Para inyectar el modelo en la clase
ZohoStore
, puedes usar el decorador@InjectModel()
de@nestjs/mongoose
. Has utilizado esto correctamente dentro de tu claseZohoStore
. Sin embargo, como estás instanciando la claseZohoStore
utilizando el operadornew
, la inyección del modelo no se está produciendo automáticamente.Para resolver este problema, puedes utilizar
ClassProvider
para inyectar el modelo en la claseZohoStore
. Aquí tienes los pasos que puedes seguir:ZohoStore
:Model<zohotokendocument>
:MongooseModule
y la claseZohoStore
, y añádelas al array deproviders
del módulo:ZohoStore
, inyéctala utilizando el decorador@Inject()
:Al hacer esto, la clase
ZohoStore
recibirá automáticamente elModel<zohotokendocument>
inyectado, sin necesidad de instanciarlo directamente. Esto debería resolver el errorundefined
que estás viendo actualmente.