【问题标题】:Need to retrieve form data需要检索表单数据
【发布时间】:2014-04-07 17:55:58
【问题描述】:

我有一些登录页面,一旦认证成功,在下一页,我应该显示登录详细信息..(即用户名和密码)

我正在使用 Express NodeJs、Passport、connect-flash、mongoose

我的问题是:我无法理解如何在下一个呈现的页面中检索用户名、密码..

请有人建议我如何实现它。我不是在问你代码,而是告诉我一种获取输出的方法。

编辑

app.js

 var http = require('http');
var express =  require('express'),
    passport = require('passport')
    , LocalStrategy = require('passport-local').Strategy,
    flash = require('connect-flash'),
    User = require('./routes/userdao.js');


passport.use(new LocalStrategy(
    function(username, password, done) {
        User.findOne({ uname: username ,pwd:password}, function(err, user) {
            if (err) { return done(err); }
            if (!user) {
                return done(null, false, { message: 'Incorrect username.' });
            }
            return done(null, user);
        });
    }
));


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

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


var app = express();


app.configure(function(){
    app.use(express.logger('dev'));     /* 'default', 'short', 'tiny', 'dev' */
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.session({ secret: 'mysecret' }));
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
    app.engine('.html', require('ejs').__express);
    app.set('view engine', 'html');
    app.set('views', __dirname + '/views');
    app.use(app.router);
    // app.use(express.errorHandler());

}).listen(3000);

console.log('Listening on port 3000...');
app.get('/',function(req,res){
  /*  req.flash('info', 'Flash is back!')
    res.redirect('/success');*/
    res.render('home.ejs');
});

app.get('/login',function(req,res){
    res.render('login.ejs');
});

app.get('/success',function(req,res){
    res.render('success.ejs',{ uname : req.user.username });
});

app.post('/login',
    passport.authenticate('local', { successRedirect: '/success', failureRedirect: '/login',
        failureFlash: true  }));

success.ejs

<%= uname %>

我正在尝试显示我在登录页面中输入的用户名。我得到输出:undefined

请告诉我出了什么问题以及我需要纠正什么?

【问题讨论】:

  • 您能否添加您可能正在使用的任何会话中间件以及您如何配置 Passport 中间件。查看此链接passportjs.org/guide/configure,尤其是中间件和会话部分。假设您打算使用会话来存储登录数据,您需要告诉 Passport 如何做到这一点。
  • @MattPileggi 我添加了完整代码,请您现在查看!
  • 谢谢。只是为了解决一个简单的问题:你确定你的 req.user 对象有一个属性“用户名”吗?当您执行 findOne 时,您正在查询 { uname: username } 所以我假设您应该为您的视图设置 { uname: req.user.uname }。
  • @MattPileggi 嗨兄弟,用户名和密码值将在提交时从登录表单中获取!因此,这意味着仅从请求中获取值!
  • 在您的 /success 处理程序内部,因为它是一个重定向,所以 req.user 将是您序列化/反序列化的对象。所以 req.user.username 将是未定义的,除非你的用户对象有 { username: 'Bob' },而看起来你的数据模型实际上有 { uname: 'Bob' }

标签: node.js express mongoose passport.js


【解决方案1】:

在最一般的意义上,如果身份验证成功,您从身份验证返回的用户对象最终会在您的下游函数中位于 req.user

http://passportjs.org/guide/authenticate/

然后,假设您正在使用会话,任何后续请求也将根据您的 serializeUser/deserializeUser 函数公开req.user

【讨论】:

  • 你能告诉我如何将“req.user”转发到下一个呈现的页面吗?
  • Passport 通过会话自动执行此操作。您应该已经配置了 passport.serializeUser(function(user,done) { ... }) 和 passport.deserializeUser(function(id,req,done) { ... }) 这就是 Passport 在会话中存储字符串的方式并且每个请求都重构一个用户对象。如果您想将该代码添加到您的问题中,您可能能够根据您在那里所做的事情获得更具体的答案。
  • 您能否在我的第一篇文章中检查我的编辑答案。我在那里添加了一些代码...请检查并告诉我我必须做什么..
猜你喜欢
  • 2019-07-19
  • 2013-01-20
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-18
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多