【问题标题】:Why Passport.js code always redirects to failure?为什么 Passport.js 代码总是重定向到失败?
【发布时间】:2017-08-17 07:18:52
【问题描述】:

我正在尝试使用 localstrategy 实现 passport.js,但无法重定向到成功路线。每当我单击提交按钮时,它总是将我重定向到失败路线。为什么会发生这种情况,我应该怎么做?

表格代码:

 <form action="/login" method="post">
    <div>
    <label>Username:</label>
    <input type="text" name="username"/>
   </div>
    <div>
    <label>Password:</label>
    <input type="password" name="password"/>
  </div>
  <div>
    <input type="submit" value="Log In"/>
   </div>
  </form>

app.js 文件代码:

  var express = require('express');
 var app = express();
 var connection = require('express-myconnection');
   var mysql = require('mysql');
  var customers = require('./routes/routes');
  var bodyParser = require('body-parser');
  var passport = require('passport')
  var flash = require('connect-flash')
  var LocalStrategy = require('passport-local').Strategy;
  var urlencodedParser = bodyParser.urlencoded({
  extended: false
  })
  app.set('view engine', 'ejs');

   app.use(
  connection(mysql, {
    host: 'localhost',
    user: 'root',
    password: '',
      database: 'nodejs'
    }, 'request')
 );
   app.get('/', customers.form);
  passport.use('local', new LocalStrategy(
  function(username, done) {
    console.log('abc');
    customers.checkStatus(username, function (err, user) {
        if (err) throw err;
        if (!user) {
            return done(null, false, {message: 'Unknown User'});
        }
    });
     }));


 app.post('/login',
   passport.authenticate('local', { successRedirect: '/success',
     failureRedirect: '/' }),
   function (req,res) {
   console.log('tets');
     res.redirect('/');
   }
 );


 var server = app.listen(8080, function() {
var host = server.address().address;
var port = server.address().port;
console.log("Example app listening at http://%s:%s", host, port);
 });

route.js 文件代码:

     exports.form = function(req,res){
    res.render('form', {
        page_title: "Login Form"
      });
  };
exports.success = function (req, res) {
    res.send('wow');
};
exports.checkStatus = function (req, res, username) {
    req.getConnection(function(err, connection) {
        connection.query('select * from login where username = ?', 
[username], function(err, rows) {
        });
    });
}

【问题讨论】:

  • customers.form 是什么意思?它包含什么?
  • 我在顶部创建了客户作为变量,并在其中包含了路由文件的路由,其中​​声明了 form() 方法
  • 把你的问题分成几块并定义问题的根源。
  • Ayesha,它甚至没有进入 passport.use 函数,我正在尝试 console.log 但它没有进入那个函数。
  • 其实我只是想用passport.js创建简单的登录功能。我正在运行此代码,并在按下提交按钮时将我重定向失败重定向。我认为它甚至没有进入 passport.js 函数

标签: node.js passport.js


【解决方案1】:

因为我能够解决您的问题,即不重定向到失败,登录后它进入护照功能并打印您在控制台中放置的任何内容。但是在登录表单中输入详细信息后,它正在重定向到数据库连接。那里我得到 TypeError: req.getConnection is not a function 我试图解决它。即使我无法解决这个问题。因为我对连接 mysql 没有太多想法nodejs.我正在研究 mongodb。这里我给出了一个链接,尝试解决这个问题req.getConnection is not a function in express-myconnection

并用这个替换 app.js 代码我做了一些更改

    var express = require('express');
    var path = require('path');
    var ejs = require('ejs');
    var cookieParser = require('cookie-parser');
    var logger = require('morgan');
    var session = require('express-session');
    var customers = require('./routes/routes');
    var bodyParser = require('body-parser');
    var passport = require('passport')
    var flash = require('connect-flash')
    var LocalStrategy = require('passport-local').Strategy;
    var urlencodedParser = bodyParser.urlencoded({
      extended: false
      })
    var app = express();
    var mysql = require('mysql'),
        connection = require('express-myconnection');
         app.use(
    connection(mysql, {
    host: 'localhost',
    user: 'root',
    password: '',
      database: 'nodejs'
    }, 'request')
 );
        app.use(logger('dev'));
        app.use(bodyParser.json());
        app.use(bodyParser.urlencoded({ extended: false }));
        app.use(cookieParser());
        app.use(session({secret: '{secret}', name: 'session_id', saveUninitialized: true, resave: true}));
        app.use(passport.initialize());
        app.use(passport.session()); 
        app.use(flash()); 
        app.set('view engine', 'ejs');

        passport.use('local', new LocalStrategy(
        function(username, done) {
        console.log('abc');
        customers.checkStatus(username, function (err, user) {
            if (err) throw err;
            else{
            if (!user) {
                return done(null, false, {message: 'Unknown User'});
            }
            if(user){
                res.send("User");
                }
            }
        });
         }));
       app.get('/login', customers.form);
       app.get('/success',customers.success);
       app.get('/fail',customers.fail)
       app.post('/login', passport.authenticate('local', { successRedirect: '/success',
         failureRedirect: '/fail',
         failureFlash: true
         }));

    var server = app.listen(8080, function() {

    var port = server.address().port;
    console.log("Example app listening at http://localhost:%s", port);
     });

这是 routes.js 代码

exports.checkStatus = function (req, res, next) {
    req.getConnection(function(err, connection) {
          if (err) return next(err); 
        connection.query('SELECT * FROM login', function(err, rows) {
       if (err) console.log("Error Selecting : %s ", err); 
   res.render('form', { 
     page_title: "Login form", data: rows 
   }); 
  }); 
  });
 };
exports.form = function(req,res){
      res.render('/give the path of form.ejs', { message: req.flash('loginMessage')
      });
        }
exports.success = function (req, res) {
    res.send('wow');
};
exports.fail= function (req, res) {
    res.send('Noooooo');
};

打开浏览器并尝试使用此http://localhost:8080/login。希望这对您有所帮助...

【讨论】:

  • 你解决了 req.connection() 问题吗?如果是。你如何解决这个问题?
  • Ayesha,req.getConnection() 不是问题。因为它是用来连接mysql数据库的。虽然它已连接
猜你喜欢
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多