Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 护照没有';t将子文档保存到req.user_Javascript_Node.js_Passport.js_Passport Local - Fatal编程技术网

Javascript 护照没有';t将子文档保存到req.user

Javascript 护照没有';t将子文档保存到req.user,javascript,node.js,passport.js,passport-local,Javascript,Node.js,Passport.js,Passport Local,passport.js passport.serializeUser(function(user, done) { done(null, user._id); }); passport.deserializeUser(function(id, done) { User .findById(id).exec() .then(function(user) { done(null, user); }, done) ; }); passport.use(

passport.js

passport.serializeUser(function(user, done) {
  done(null, user._id);
});
passport.deserializeUser(function(id, done) {
  User
    .findById(id).exec()
    .then(function(user) {
      done(null, user);
    }, done)
  ;
});

passport.use(new LocalStrategy(function(username, password, done) {
  Local
    .findOne({ username: username })
    .select('username role hashedPassword')
    .exec()
    .then(function(local) {
      if (!local) {
        return done(null, false);
      }
      var validPassword = bcrypt.compareSync(password, local.hashedPassword);
      if (!validPassword) {
        return done(null, false);
      }
      else {
        User
          .findOne({ local: local })
          .populate('local')
          .exec()
          .then(function(user) {
            console.log('user: ', user); // has subdocument
            return done(null, user);
          })
        ;
      }
    })
  ;
}));
router.get('/current-user', Auth.isLoggedIn, function(req, res) {
  console.log('req.user: ', req.user); // doesn't have subdocument
  res.status(200).json(req.user);
});
auth.routes.js

passport.serializeUser(function(user, done) {
  done(null, user._id);
});
passport.deserializeUser(function(id, done) {
  User
    .findById(id).exec()
    .then(function(user) {
      done(null, user);
    }, done)
  ;
});

passport.use(new LocalStrategy(function(username, password, done) {
  Local
    .findOne({ username: username })
    .select('username role hashedPassword')
    .exec()
    .then(function(local) {
      if (!local) {
        return done(null, false);
      }
      var validPassword = bcrypt.compareSync(password, local.hashedPassword);
      if (!validPassword) {
        return done(null, false);
      }
      else {
        User
          .findOne({ local: local })
          .populate('local')
          .exec()
          .then(function(user) {
            console.log('user: ', user); // has subdocument
            return done(null, user);
          })
        ;
      }
    })
  ;
}));
router.get('/current-user', Auth.isLoggedIn, function(req, res) {
  console.log('req.user: ', req.user); // doesn't have subdocument
  res.status(200).json(req.user);
});
输出

user:  { _id: 55d8c6f7e1092f25bb761690,
  local:
   { _id: 55d8c6f7e1092f25bb76168f,
     username: 'a',
     role: 'user',
     __v: 0 },
  __v: 0 }
    ✓ Can log in with valid credentials
req.user:  { _id: 55d8c6f7e1092f25bb761690,
  local: 55d8c6f7e1092f25bb76168f,
  __v: 0 }
当我将用户保存到
req.user
(在
passport.js
中)时,它有子文档
local
。但是当我稍后尝试访问
req.user
时,它会给我
ObjectId
,而不是子文档


为什么会这样?如何获取子文档而不是
ObjectId

这大致就是Passport的工作原理:

  • 当用户尚未登录时调用该策略;如果登录被接受,则传递给回调的用户将被传递给
    serializeUser()
    ,以存储(部分)在会话存储中。在您的情况下,您将用户
    \u id
    存储在会话存储中
  • 反序列化用户()
    在用户登录时调用(换句话说,当存在有效会话时)。会话值(
    \u id
    )被传递给它,传递给回调的值被存储为
    req.user

因此,您也需要从
反序列化用户()
中填充
本地
,否则它在
req.user

中不可用。您是如何实现
反序列化用户()
?@robertklep我用代码更新了我的问题。将
populate('local')
添加到
反序列化用户()
修复了它。谢谢你能把它写下来作为答案吗?