2017-07-13 3 views
0

J'essaie d'ajouter une propriété à un objet. J'ai une liste avec les clients, et pour chaque client, je veux ajouter un tableau avec les mails qui sont envoyés à ce client.Comment mettre à jour un élément d'objet via la boucle

Mais je ne peux pas l'ajouter à l'objet existant. Qu'est-ce que je fais mal?

crmuser.find().exec(function(err, crmusers){ 
    console.log(crmusers); 

    //LOG result 
    [ { _id: 59563a7181438f4db8193379, 
     emailName: 'Donald Duck', 
     shop: 'dd', 
     moreproperties: '', 
     email: '[email protected]', 
    } ] 

    async.each(Object.keys(crmusers), function(key, callback){ 
     mailService.getLogs({to: crmusers[key].email, typeMail: "CRM"}, function(err, result){ 
     console.log("res", result); // here we have the result from the mailService.getLogs() function 


     crmusers[key]["sendMail"] = {result}; //Here I try to add a new property to the object 

     console.log("USERR", crmusers[key]); // And here I can see that the property is not added 
     callback(); 
     }) 
    }, function(){ 
     status = 200; 
     response = {message: 'OK', crmusers}; 
     return res.status(status).json(response); 
    }) 
}) 
+0

Pouvez-vous vous connecter 'err' et vérifier toutes les erreurs? – Sridhar

+0

Votre code fonctionne bien pour moi. Peut-être plusieurs éléments avec le même identifiant dans le tableau? – Sridhar

Répondre

0

Au lieu de itérer les valeurs avec un each ou forEach vous pouvez utiliser une fonction map pour retourner un nouvel objet de chaque élément de votre tableau utilisateurs. Comme vous êtes utilisateurs variable est un objet pas un tableau la meilleure méthode async à utiliser serait mapValues:

const users = { 
john: { email: '[email protected]' }, 
anne: { email: '[email protected]' } 
}; 

async.mapValues(users, function (user, key, callback) { 
    mailService.getLogs({to: user.email, typeMail: "CRM"}, function(err, result){ 
    if (err) callback(err); 
    user["sendMail"] = result; 
    callback(null, user); 
    }) 
}, function(err, result) { 
    // result is now a new map of your users 
    // { 
    // john: { sendMail: 'result', email: '[email protected]' }, 
    // anne: { sendMail: 'result', email: '[email protected]' } 
    // }; 
}); 
+0

Merci! Mais je reçois un 'TypeError: Impossible de lire la propriété 'Symbol (Symbol.toStringTag)' de l'erreur undefined' sur' async.mapValues ​​(crmusers), fonction (utilisateur, clé, callback) {'crmusers est un objet que nous demandons à mongoose . Comme 'crmusers.find(). Exec (fonction (err, crmusers)' – NVO

+0

Édité ma question avec la ligne find et le résultat de crmusers – NVO

+0

Ajouter une console de l'objet cmsusers – sidhuko