2015-09-23 2 views
-1

Je suis très confus de ce qui se passe ici. J'essaye de placer une image de profil par défaut de res.locals pour un utilisateur s'ils n'en ont pas actuellement. Voici mon code:Express.js - La définition de res.locals modifie l'objet req

// Make user object available in templates. 
app.use(function(req, res, next) { 
    res.locals.user = req.user; 
    if (req.user && req.user.profile) { 
    console.log('Request Picture: ', req.user.profile); 
    res.locals.user.profile.picture = req.user.profile.picture || defaults.imgs.profile; 
    console.log('Request Picture After Locals: ', req.user.profile); 
    } 
    next(); 
}); 

// Console Results 
Request Picture: { picture: '', 
    website: '', 
    location: '', 
    gender: '', 
    name: 'picture' } 
Request Picture After Locals: { picture: '/img/profile-placeholder.png', 
    website: '', 
    location: '', 
    gender: '', 
    name: 'picture' } 

Je veux être capable d'écrire JADE sans avoir à manipuler quelque chose comme ceci: img(src=user.profile.picture || defaults.profile.picture). Donc, le code ci-dessus fonctionne très bien dans toutes les vues JADE.

Mais, j'ai besoin de vérifier le req.user.profile.picture quelque part d'autre afin de changer l'image.

if (!req.user.profile.picture) {do stuff}

Comme vous pouvez le voir ci-dessus la req a été modifiée. Réglage res.locals ne devrait pas changer l'objet req ... correct!? Ou est-ce que je manque quelque chose?

Merci pour toute aide!

Répondre

1

Les objets en Javascript sont assignés par un pointeur. Alors, quand vous faites ceci:

res.locals.user = req.user; 

Vous avez maintenant deux res.locals.user et req.user pointant exactement le même objet. Si vous modifiez ensuite cet objet par l'un ou l'autre, les deux pointent sur le même objet afin que les deux voient le changement. Peut-être que ce que vous voulez faire est de COPIER l'objet req.user sur res.locals.user afin que vous ayez deux objets complètement séparés qui peuvent être modifiés indépendamment.

Il existe différents mécanismes pour la copie (ou clonage) un objet dans Node.js montré ici:

Cloning an Object in Node.js

Il y a aussi Object.assign()

+0

Oh wow ... Je ne peux pas croire que je manqué ça. Ici, je pense que c'est une chose Express quand c'est une simple chose JS. C'est un "gotcha" dans JS. Merci pour l'aide! Réponse acceptée. – Beau