mongoose-paginate-v2
mongoose-paginate-v2 copied to clipboard
class-transformer not working properly
Hey!
I'm actually facing an issue using class-transformer using NestJS. I try to exclude some properties for my response, but getting following error:
TypeError: obj.toObject is not a function
Method I'm using to create paginate:
const posts = await this.post.paginate(undefined, {
limit: 10,
page,
populate: [
{
path: 'user',
transform: (doc: any, id: any) => {
return new User(doc);
},
populate: {
path: 'profile',
model: 'Profile',
transform: (doc: any, id: any) => {
return new Profile(doc);
},
},
},
{path: 'book'},
],
sort: {_id: -1},
});
The following entities User & Profile is a normal Scheme which looks for example like this:
@Schema({collection: 'users', versionKey: false})
/**
* @class User
*/
export class User {
@Exclude()
/**
* @public
* @property
* @type {string}
*/
public id: string;
@Prop({required: true, unique: true})
/**
* @public
* @property
* @type {string}
*/
public username: string;
@Prop({required: true})
@Exclude()
/**
* @public
* @property
* @type {string}
*/
public password: string;
@Prop({required: true, unique: true})
/**
* @public
* @property
* @type {string}
*/
public email: string;
@Exclude()
@Prop()
/**
* @public
* @property
* @type {Date}
*/
public created_at: Date;
@Prop()
@Exclude()
/**
* @public
* @property
* @type {Date}
*/
public updated_at: Date;
@Prop({type: Types.ObjectId, ref: 'Profile'})
/**
* @public
* @property
* @type {Profile}
*/
public profile: Profile | Types.ObjectId;
/**
* User constructor
*
* @constructor
* @param {Partial<User>} partial
*/
constructor(partial: Partial<User>) {
Object.assign(this, partial);
}
}
How I create the response:
const posts = await this.postService.getHomePostsPaginate(
query.page ? query.page : 1
);
const postsArray: any[] = [];
posts.docs.forEach((v) => {
// @TODO transform v.user & v.user.profile
v.user = new User(v);
v.user.profile = new Profile(v.user.profile);
postsArray.push(v);
});
Even without using the transform object in my populate I'm facing the same error.
I've an example where it works using findOne() (Excluding properties works):
const user = await this.userService.getByName(req.user.username, true);
user.profile = new Profile(user.profile);
``
Is there any reason for this behaviour? I appreciate every help!
Duplicate of #160
@necm1 It seems there is an issue with toObject, which we need to figure it out.
I have spent sometime with this, and still no idea what's causing this issue.
@necm1 Please how did you add paginate method to your mongoose model? Typescript keeps throwing an error that paginate does not exist on a mongoose document.
@necm1 Please how did you add
paginatemethod to your mongoose model? Typescript keeps throwing an error thatpaginatedoes not exist on a mongoose document.
You need to use the PaginateModel<T>-interface i.e.:
import {PaginateModel} from 'mongoose';
/**
* BookService constructor
*
* @constructor
* @param {PaginateModel<Book & Document>} book
* @param {CacheService} cacheService
* @param {AuthorService} authorService
*/
constructor(
@InjectModel(Book.name) private book: PaginateModel<Book & Document>,
private readonly cacheService: CacheService,
private readonly authorService: AuthorService
) {}
@aravindnc some time passed - did you find any solution / fix for this issue?