I need to integrate a CRM API with my service in Nest.js. Unfortunately, they require I implement their interface to use a custom persistence layer, in my case, Mongo. Since I'll need to instantiate the resulting class, I can't inject the model as I normally would so I tried using this on the class member variable instead. However, this results in an error that the member variable is undefined.
This is my mongoose model:
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);
This is the custom class I'm creating as required by the 3rd party API:
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;
}
...
And in my service, I'm just instantiating this class as new ZohoStore(), which works fine until the getToken() method is called later.
The resulting error is: "nullTypeError: Cannot read property 'findOne' of undefined",, which to me means the tokenModel is not being instantiated. Any idea how I can get my model injected into this class without putting it in the constructor, otherwise I can't instantiate it with a zero-arg constructor from my service?
CodePudding user response:
If you're trying to use Nest DI system, then you just can't call new ZohoStore() by yourself because Nest has no chance to instantiate ZohoStore's dependencies.
You'll need to register it as a provider in some NestJS module and then retrive the instance created by NestJS if you want to.
