Skip to content
This repository has been archived by the owner on Jun 29, 2021. It is now read-only.

Using Mongoose Plugins ? #15

Closed
simonB12 opened this issue Aug 1, 2017 · 8 comments · Fixed by #16
Closed

Using Mongoose Plugins ? #15

simonB12 opened this issue Aug 1, 2017 · 8 comments · Fixed by #16

Comments

@simonB12
Copy link
Contributor

simonB12 commented Aug 1, 2017

Is there any way to use the very useful Plugins from mongoose ? Or anything allowing me to re-use a bunch of properties in several models ?

Re-using the a sub schema could be a solution but it does not allow custom pre-validation on on the added properties. I've also tried using typescript mixins, but this method needs to redeclare the variables in the implementing class.

Any ideas about this ?

Thanks in advance.

@szokodiakos
Copy link
Owner

Thanks for your interest in Typegoose. Plugins are currently not supported however can be easily implemented (which I will try to do in sometime in the near future) as class decorators.

I will change this to enhancement and create a pull request for this when ready.

If I am correct your other question is that is it possible to reuse properties? I haven't tested this but if you create a base class 'A' which extends Typegoose and you extend class 'B' and 'C' from class 'A' then B and C will have A's properties. Is this what you want to do?

@gkTim
Copy link

gkTim commented Aug 8, 2017

Thanks for the plugin annotation works great!

For some plugins like mongoose-pagination it would be great to initialize static as an empty object.
Currently you must add one static methods to the schema so it can initialize it correctly.

The extension of classes seems not possible at the moment.
The extended classes do not inherit the attributes from the parent class also not the pre decorators.
Don't know if they inherit the static methods.

@stuartwk
Copy link

Hey, awesome work on Typegoose. I'm having issues using the plugin functionality. Tried to implement it using the docs, but can't seem to get it to work. https://stackoverflow.com/questions/45775134/using-plugins-with-typegoose.

@szokodiakos
Copy link
Owner

szokodiakos commented Aug 20, 2017

Hey @stuartkuentzel, thanks for your interest in Typegoose!

Unfortunately when applying a Mongoose plugin, TypeScript has no information about the plugins "class signature" e.g. which new properties and methods will the plugin add to the schema. This is why the additional typing infos must be provided by hand, as the Typegoose docs states:

If the plugin enhances the schema with additional properties or instance / static methods this typing information should be added manually to the Typegoose class as well.

So in your case you must add authenticate, serializeUser, and deserializeUser to the Typegoose extending User class.

import * as passportLocalMongoose from 'passport-local-mongoose';
import { prop, Typegoose, plugin } from 'typegoose';

@plugin(passportLocalMongoose)
class User extends Typegoose {

    @prop()
    email: string;

    @prop()
    username: string;

    @prop()
    password: string;

    // method return values are not represented here, you'll have to look for the plugin's docs to see what they actually return
    static authenticate();
    static serializeUser();
    static deserializeUser();

}

export const UserModel = new User().getModelForClass(User);

And basically that is it! Hope it helps.

I am going to attach this link to stackoverflow too.

@stuartwk
Copy link

The issue I'm having is, TypeScript doesn't like if I follow with an instanceMethod. If I follow anything after, for example static authenticate(): any;, the following instance method will say "function implementation name must be authenticate". Thanks for your help!

@szokodiakos
Copy link
Owner

@stuartkuentzel okay i will try to reproduce the problem, meanwhile can you attach what TypeScript / Node / NPM versions are you using?

Thanks!

@stuartwk
Copy link

@szokodiakos Sure, I'm using Node 8.2.1, TypeScript 2.4.2, and NPM 5.3.0.

@lohiaad
Copy link

lohiaad commented Mar 6, 2019

@szokodiakos any solution to this problem

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants