JavaScript: dynamic property not showing unless accessed explicitly

Tags: ,



I’m using NodeJs, I’m creating a dynamic property inside an object, and then pushing it into an array. The problem is, when I access the variable via console.log(object[dynamic_property_name]) I can see it in the console, but when I console.log(object) the dynamic property doesn’t show.

here is the code, the property in question is teachers_matieres in the element object. PS: I console logged the property (explicitly) in each step of the code, even just before the return, it shows. But when I try to print the object it doesn’t show, neither in post man.

router.get('/get-all-messages', async function (req, res, next) {
  let children = [];
  const parent = await Parent.findOne({ _id: req.query.user_id });
  const students = await Student.find({ parentPersonalId: parent.personalID });
  for (let i = 0; i < students.length; i++) {
    var element = students[i];
    element['teachers_matieres'] = [0];
    const inscription = await Inscription.findOne({ studentID: element._id });
    const theClass = await Classe.findOne({ _id: inscription.classeID });
    const schedule = await Schedule.findOne({ classeID: theClass._id });
    for (let i = 0; i < schedule.teacherID.length; i++) {
    if( schedule.teacherID[i]==null)
        continue
      const tuple = [
        await Teacher.findOne({ _id: schedule.teacherID[i] }),
        await Matiere.findOne({ _id: schedule.matierID[i] }),
      ];
      // if (!tuple in element['teachers_matieres']){
        console.log(element['teachers_matieres'].push(tuple));
      // }
    }
    //director selection
    const director = await Director.find({_id:inscription.directeurID})
    element['director'] = director
    const annexe = await Annex.find({_id:director.annexID})
    const scholar = await ScholarGroup.find({_id:annexe.scholarGroupID})
    const ceo = scholar.ceo
    children.push(element);
  }
  const msgs = await Messagerie.find().or([
    { senderID: parent._id},
    { receiverID: parent._id ,
    'approved.isApproved':true},
  ]);
  return res.json({
    error: false,
    message: 'success',
    data: { children: children, messages: msgs },
  });
});

This is the output of postman:

{
"error": false,
"message": "success",
"data": {
    "children": [
        {
            "localisation": {
                "payer": "medea",
                "wilaya": "medea",
                "daira": "medea",
                "commune": "medea"
            },
            "authentication": {
                "code": "uhB9Y",
                "expired": false
            },
            "tokens": [],
            "unreadNotices": [],
            "absence": [],
            "inbox": [],
            "msgSent": [],
            "paymentTypes": [
                "5f6a1749ddcfde4f3b0ebaf4"
            ],
            "_id": "5f68a2ec489f029205bdaa42",
            "firstNameFr": "abdou",
            "lastNameFr": "moumen",
            "firstNameAr": "moumen",
            "lastNameAr": "بن احمدي",
            "parentPersonalId": "dddd",
            "birthday": "NaN-NaN-NaN",
            "inscriptionNbr": "101",
            "image": "",
            "state": false,
            "systemscolaire": "Interne",
            "__v": 0
        }
    ],
    "messages": [
        {
            "approved": {
                "isApproved": true,
                "date": "21-9-2020",
                "time": "17:22:4"
            },
            "fileUrl": [
                {
                    "fieldname": "file",
                    "originalname": "cccc.pdf",
                    "encoding": "7bit",
                    "mimetype": "application/pdf",
                    "destination": "/home/admin/assets/schools/eco1/5f6899c86f84e38b88e270c0/messagesFiles",
                    "filename": "21-9-2020_cccc.pdf",
                    "path": "/home/admin/assets/schools/eco1/5f6899c86f84e38b88e270c0/messagesFiles/21-9-2020_cccc.pdf",
                    "size": 237233
                }
            ],
            "_id": "5f68dfae6a7b33b1c7b1f688",
            "senderID": "5f68a354489f029205bdaa45",
            "receiverID": "5f68a2d5cff2d591af390281",
            "subject": "teacher ver parent",
            "description": "<p>teacher ver parent</p>n",
            "date": "21-9-2020",
            "time": "17:15:26",
            "__v": 0
        },
        {
            "approved": {
                "isApproved": true,
                "date": "22-9-2020",
                "time": "10:53:39"
            },
            "fileUrl": [
                {
                    "fieldname": "file",
                    "originalname": "NoticeSendReceive.js",
                    "encoding": "7bit",
                    "mimetype": "text/javascript",
                    "destination": "/home/admin/assets/schools/eco1/5f6899c86f84e38b88e270c0/messagesFiles",
                    "filename": "21-9-2020_NoticeSendReceive.js",
                    "path": "/home/admin/assets/schools/eco1/5f6899c86f84e38b88e270c0/messagesFiles/21-9-2020_NoticeSendReceive.js",
                    "size": 25393
                }
            ],
            "_id": "5f68e2174ce23cb39a7b9d22",
            "senderID": "5f68a354489f029205bdaa45",
            "receiverID": "5f68a2d5cff2d591af390281",
            "subject": "teacher ver parent",
            "description": "<p>message</p>n",
            "date": "21-9-2020",
            "time": "17:25:43",
            "__v": 0
        }
    ]
}
}

I really need to append that property to each element, how can I do that? what’s wrong with the dynamic property?

Answer

The problem was that the objects returned from mongoose inherit from document, and they are not plain JSON objects, they use .toObject() method to obtain the json object. what i had to do was add .lean() in the query like so Model.findOne().lean().exec() it tells mongoose to return a plain json object.

reference: similar question



Source: stackoverflow