1

The server has a Meteor Method that returns a GiftList object that contains a Gift set.

The client has a Meteor Call that prints out the result. The Gift set is undefined even though it is initialised and sent by the server. The instance variables don't seem to be included in the response even though the server has sent it.

Gift List

import {Gift} from "../gift/Gift";

export class GiftList {

    private _id: number;
    private _personName:string;
    private _user: User;

    private _gifts: Set<Gift>;

    get id(): number {
        return this._id;
    }

    set id(value: number) {
        this._id = value;
    }

    get personName(): string {
        return this._personName;
    }

    set personName(value: string) {
        this._personName = value;
    }

    get user(): User {
        return this._user;
    }

    set user(value: User) {
        this._user = value;
    }

    get gifts(): Set<Gift> {
        return this._gifts;
    }

    set gifts(value: Set<Gift>) {
        this._gifts = value;
    }
}

Gift

import {GiftList} from "../giftlist/GiftList";

export class Gift {

    private _id: number;
    private _name: string;
    private _description: string;
    private _isPrivate: boolean;
    private _cost: number;

    private _giftList: GiftList;

    get id(): number {
        return this._id;
    }

    set id(value: number) {
        this._id = value;
    }

    get name(): string {
        return this._name;
    }

    set name(value: string) {
        this._name = value;
    }

    get description(): string {
        return this._description;
    }

    set description(value: string) {
        this._description = value;
    }

    get isPrivate(): boolean {
        return this._isPrivate;
    }

    set isPrivate(value: boolean) {
        this._isPrivate = value;
    }

    get cost(): number {
        return this._cost;
    }

    set cost(value: number) {
        this._cost = value;
    }

    get giftList(): GiftList {
        return this._giftList;
    }

    set giftList(value: GiftList) {
        this._giftList = value;
    }
}

Server - Meteor Method

Meteor.methods({
    "getGiftLists": function (): GiftList[] {
        const giftList: GiftList =  new GiftList();
        giftList.gifts = new Set();

        const gift: Gift = new Gift();
        gift.name= "Example gift";
        gift.description = "Description of gift";
        giftList.gifts.add(gift);

        // I've printed the value here and the gift list definitely contains gifts as expected. 
        return [giftList]
    }
})

Client - Meteor Call

Meteor.call("getGiftLists", {}, (err: any, res: GiftList[]) => {
    if (err) {
        alert(err);
    } else {
        console.dir(res); // Defined 
        console.log(res.length) // 1
        console.dir(res[0].gifts); // Undefined
        callback(res);
    }
});

Question

Why is the Gift set undefined?

Michael
  • 3,411
  • 4
  • 25
  • 56

1 Answers1

2

I believe the problem here is that Metoer's EJSON doesn't know how to serialize a Set to be sent to the client. EJSON provides a way to define new types and how they should be serialized and de-serialized. Have a look at the EJSON docs.

https://docs.meteor.com/api/ejson.html

Kelly Copley
  • 2,990
  • 19
  • 25
  • That would make a lot more sense! I'll try using an array tomorrow. Should errors be thrown in cases like this? – Michael Feb 21 '21 at 00:13
  • I would say that it should probably throw errors. The fact that it doesn't may be due to the fact that Maps and Sets were not part of the ECMAScript spec at the time when this code was written. Might be a good bug report/feature request. – Kelly Copley Feb 24 '21 at 18:33