Express.js - 设置res.locals会更改req对象

时间:2015-09-23 00:17:27

标签: javascript node.js express locals

我很困惑这里发生的事情。我正在尝试为用户设置res.locals默认个人资料图片,如果他们当前没有。这是我的代码:

// 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' }

我希望能够在不必处理这样的事情的情况下编写JADE:img(src=user.profile.picture || defaults.profile.picture)。所以上面的代码在所有JADE视图中都能正常工作。

但是,我需要检查其他地方的req.user.profile.picture以更改图片。

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

如您所见,req已更改。设置res.locals不应该更改req对象...正确!?或者我错过了什么?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Javascript中的对象由指针指定。所以,当你这样做时:

res.locals.user = req.user;

现在,您res.locals.userreq.user指向完全相同的对象。如果然后通过任何一个修改该对象,则两者都指向同一个对象,因此两者都将看到更改。

或许您要做的是将req.user对象复制到res.locals.user,这样您就可以独立修改两个完全独立的对象。

在这里显示的node.js中有各种复制(或克隆)对象的机制:

Cloning an Object in Node.js

还有Object.assign()