护照js和护照本地添加用户时出现“错误:无法将用户序列化到会话中”的问题

3
我已经按照这里的代码进行了操作 - > https://github.com/jaredhanson/passport-local/tree/master/examples/express3,为用户添加本地身份验证。
问题在于当我尝试添加用户时,
因此,我创建了这个路由。
app.get('/signup', function(req,res){
  res.render('/signup');
});

app.post('/signup', function(req,res){
  var body = req.body;
  users.push(body);
  res.redirect('/');
});

然后是包含表单的页面。它是:

form(method='POST', action='/signup')
 input(type='text', name='username', placeholder='username')
 input(type='text', name='password', placeholder='password')
 button.btn Register

虚拟数据库是示例中的一个。

users = [
  {id:1, username: 'test', password:'papapa'}
];

当我使用表单发送信息时,一切都正常,但是当我尝试使用新创建的用户登录时,会提示“错误:无法将用户序列化到会话中”

这里是 serializeUser 的代码:

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

passport.deserializeUser(function(id, done) {
  findById(id, function (err, user) {
    done(err, user);
  });
});
2个回答

5

在POST /signup路由中推送的用户将没有ID,而示例序列化代码需要该ID。

将其更改为类似以下内容,应该可以正常工作。

app.post('/signup', function(req,res){
  var body = req.body;
  body.id = users.length;
  users.push(body);
  res.redirect('/');
});

(请注意,这只是一个示例,不建议在“真正”的应用程序中使用。)

什么是管理数据库和添加用户身份验证的推荐方式? - Nonyck
没有推荐的方法,可以根据您的应用程序进行适当的处理。一个好的开始是使用真实的数据库来持久化数据 :) - Jared Hanson
我找不到一个好的可用示例,看起来我将不得不转向Rails,因为数据库集成非常容易。 - Nonyck

2
我猜你缺少了会话序列化器。请查看 https://github.com/jaredhanson/passport 中的“Sessions”部分。
基本上,你需要两个函数,一个是将当前用户保存到会话中(passport.serializeUser),另一个是读取它(passport.deserializeUser)。

我按照这个例子 -> https://github.com/jaredhanson/passport-local/tree/master/examples/express3,所以方法存在。我必须在我的方法上调用它们吗? app.post('/signup'..... ??? - Nonyck
不,你不需要直接调用它们,只需提供函数给passport.[de]serializeUser()。然而,我仍然认为你的序列化函数有问题。查看passport代码(https://github.com/jaredhanson/passport/blob/master/lib/passport/index.js#L281),当没有注册serializer()函数时,会触发该错误。 - Sergio Cinos
我添加了序列化方法。 - Nonyck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接