node.js - 使用 PassportJS 在 Session 中修改 user.username

标签 node.js express passport.js

我有一个表单,允许人们更新他们的个人资料信息,其中填充了通过 PassportJS 来自 req.user 的数据。

问题是,每当我更新对应于 user.username 的值时,我都会收到以下错误消息:

TypeError: Cannot read property '_id' of null 

从这段代码的第 6 行开始:

passport.deserializeUser(function(id, done) {
  mongo.connect("mongodb://localhost:27017/formulas", function(e, db){
  if (e) {return next(e);}
  var col = db.collection("users");
  col.findOne({"username": id}, function(err, user){
    done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas});
    });
  });
});

我假设这是因为在 serializeUser 中,我使用 user.username 将其加载到 session 中,如下所示:

passport.serializeUser(function(user, done) {
  done(null, user.username);
});

有谁知道如何解决这个问题,或者它是 Passport 的一个棘手问题吗?

我拥有的执行更新的代码通常如下所示:

router.post('/update-profile', function(req, res) {
    var name = req.body.name;
    var username = req.body.username;
    var db = req.db.collection('users');

    db.updateOne({"username": username}, {
      $set: {
          "name": name,
          "username": username,
        }
      }, function(err, r) {
         assert.equal(null, err);
         assert.equal(null, r.matchedCount);
      }
    });
    res.render('profile', {
      user: req.user
    });
  });

更新:

根据评论请求,serializeUser 中的 findOne 的错误消息在被调用时为 null,因此问题不是查询。

最佳答案

由于 username 是可更改的值,因此您不应将其用作 session cookie 键。

我强烈建议使用 user._id 代替,因为它是未更改的值,这样服务器仍然“知道”当前用户即使用户名已更改。查官方http://passportjs.org/docs ,他们还使用 id 作为 session cookie 键。

顺便说一句,即使您使用的是 username,您也应该对 passport.deserializeUser() 进行 NULL 检查:

col.findOne({"username": id}, function(err, user){
    if (user) {
        done(err, {"id": user._id, "username": id, "activeEmail": user.activeEmail, "name": user.name, "password": user.password, "formulas": user.formulas});
    } else {
        done(new Error('User not found'));
    }
});

关于node.js - 使用 PassportJS 在 Session 中修改 user.username,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45446637/

相关文章:

javascript - 遍历 JSON 并将数组更改为字符串

mysql - Sequelize 使用关联创建对象

node.js - Node.js 中的中间件与 OO JavaScript

javascript - 调用不带参数且未定义默认参数的函数

javascript - 如何从一个文件导出变量并在另一个文件上 require() 导出的变量?

node.js - 如何从同一局域网中的远程计算机访问 Node 服务器

javascript - 用户是否可以添加/更改 "request"对象的属性(并导致安全漏洞)?

node.js - 在nodejs mongostore中维护跨子域的登录 session

javascript - 使用 Node.js 的文件路径问题

node.js - Nodejs 二进制 http 流