错误:发送后无法设置标头

时间:2015-01-08 22:44:49

标签: node.js mongodb express

我有两个模式,一个用于用户,一个用于友谊系统(跟随系统)

module.exports = mongoose.model('User', {

email: {
    type: String,
    unique: true,
    lowercase: true
},

password:String,

profile: {
    fullname: String,
    gender: String,
    role: {type: String, default: 'Autorizado'},
    country: String },
});

这对于朋友系统

module.exports = mongoose.model('Friendship', {
    follower: String,
    followed: String
});

我正在使用护照来授权我的用户...问题是我想使用res.locals全局加载用户信息和与用户相关的朋友信息我使用登录后路由中的2个函数来实现....

router.post('/login', userController.postLogin,friendController.getFollow);

这是我的postlogin功能

exports.postLogin = function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) return next(err);
    if (!user) {
      req.flash('errors', { msg: info.message });
      return res.redirect('/login');
    }
    req.logIn(user, function(err) {
      if (err) return next(err);
      req.flash('success', { msg: 'Success! You are logged in.' });
      res.redirect('/');
    });
  })
  (req, res, next);
};

当我尝试执行此代码时一切正常但是当我登录时遇到标题错误,请问如何解决这个或其他方式来获取用户并按照信息在每个视图中使用它?

编辑3:仅适用于接下来的两个视图

单用户页面

<%= info.profile.fullname %>
<br>
<%= info.email %>
<br>
<%= info.profile.country %>
<br>
<%= user.follow %>
<br>
<% if(user && (user._id != info.id)){ %>
<br>
<form action="/follow/<%= info._id %>" method="post">
<button type="submit">Follow</button></form>
<%}%>
<br>
<a href="/users">atras</a>

注册用户列表

<%if (user) {%>
<h1>Hola <%= user.profile.fullname %> </h1>
<%}%>
<br>
<% users.forEach(function (user) {%>
<a href="/users/<%= user._id %>"><p><%= user.profile.fullname %></p></a>
<%});%>
<a href="/">Home</a>

这是我的索引,在此视图中,user.follow不起作用

<%if (!user) {%>
<a href="/signup">sign up</a>
<br>
<a href="/login">login</a>
<%} else { %>
<h1>Hola <%= user.profile.fullname %> Eres lo Maximo</h1>

<a href="/profile">perfil</a>
<br>
<a href="/logout">Logout</a>
<br>
<%}%>
<br>

Lista de Usuarios

编辑4:新的deserializeUser配置。

passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {

FF.find({ follower:id }, function(err, follow) {
user.follow = follow;
});
done(err, user);
});
});

编辑5:这是我的路线代码

router.get('/', function(req, res) {
res.render('index');
});

router.get('/login', userController.getLogin);
router.post('/login', userController.postLogin);
router.get('/logout', userController.logout);
router.get('/signup', userController.getSignup);
router.post('/signup', userController.postSignup);
router.get('/profile', passportConf.isAuthenticated, userController.getAccount);
router.post('/profile', passportConf.isAuthenticated, userController.postUpdateProfile);

1 个答案:

答案 0 :(得分:0)

您的friendController.getFollow仅适用于'/login'页面的请求,因此follow对象不会持续在其他路线上可用。要解决此问题,您必须将所有代码放在passport.deserializeUser函数中。

passport.deserializeUser函数中,您只能调用done一次,因此您必须在follow的回调中放置逻辑以查找User.find,以便您可以附加{ {1}}至follow

这允许您从我认为是导致错误的user路线中移除friendController.getFollow