【问题标题】:Passport.js route not redirectingPassport.js 路由未重定向
【发布时间】:2014-12-09 21:25:33
【问题描述】:

更新:为我的 successRedirect 使用不同的路径我已经成功地获得了对我的 GET 请求的 200 响应(请参见下面的代码)。不过,这只是我第一次上这条路线的时候。即便如此,浏览器也不会改变呈现的页面。即在我成功注册一个虚拟用户后,没有实际的重定向。

在对代码 304 进行了更多研究并进行了一些播放之后,这似乎是一个缓存问题,但到目前为止,这就是我所了解的。

获取/测试

app.get('/test', function(req, res) {
        res.render('video-view.html');
    });

    // process the signup form
    app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/test', // redirect to the secure profile section
        failureRedirect : '/sign-up', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

在本地注册成功后,我很难让路由器正确重定向。我的 /config/passport.js 文件正确地向数据库添加了一行,并且似乎序列化了会话。它将用户返回到我的路由器,该路由器尝试重定向浏览器。查看我的控制台请求,我看到了这个不成功的请求:GET /home 304。

我已经为此工作了很长时间,但无法找到解决方案或解决问题。我的部分问题是我没有使用模板引擎 - 只是提供使用 angular.js 编写的 html。也许我没有正确配置它,但所有其他路由和功能都运行良好。有什么想法吗?

这是我的路由器代码:

var express = require('express');

module.exports = function(app, passport) {

    app.get('/signup', function(req, res) {
        // render the page and pass in any flash data if it exists
        res.render('sign-up.html');
    });

    app.get('/home', function(req, res) {
        res.render('video-view.html');
    });

    app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/home', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    }));

};

我的服务器是这样设置的:

var express  = require('express');
var app      = express();
var port     = process.env.PORT || 8080;
var passport = require('passport');
var flash    = require('connect-flash');

require('./config/passport')(passport); // pass passport for configuration

app.configure(function() {
    app.use(express.logger('dev')); // log every request to the console
    app.use(express.cookieParser()); // read cookies (needed for auth)
    app.use(express.bodyParser()); // get information from html forms
    app.engine('html', require('ejs').renderFile);
    app.use('/', express.static(__dirname + '/views'));

    app.use(express.session({ secret: 'vidyapathaisalwaysrunning' } )); // session secret
    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    app.use(flash()); // use connect-flash for flash messages stored in session
});

require('./app/routes.js')(app, passport); // load our routes and pass in our app and fully configured passport

app.listen(port);

【问题讨论】:

    标签: angularjs node.js express passport.js


    【解决方案1】:

    我认为回家 304 不一定是错误。它告诉你它正在获取页面,但我相信它没有改变。我认为的问题是你发回的东西。我不熟悉 ejs 的工作原理,但你只是想渲染一个 html 页面吗?那么我相信你应该使用 sendFile,而不是渲染。

    15 Oct 01:25:24 - [nodemon] starting `node ./bin/www`
    GET / 200 826.199 ms - 11667
    GET /js/lib/bootstrap.min.js 304 3.557 ms - -
    GET /js/lib/metisMenu.min.js 304 2.810 ms - -
    GET /js/lib/morris.min.js 304 0.607 ms - -
    GET /js/lib/raphael.min.js 304 1.195 ms - -
    GET /js/lib/sb-admin-2.js 304 0.522 ms - -
    GET /js/lib/angular/angular-bootstrap.min.js 304 1.334 ms - -
    GET /js/app/app.js 304 2.389 ms - -
    GET / 200 366.541 ms - 11667
    GET /css/bootstrap/bootstrap.min.css 304 1.078 ms - -
    GET /css/mm/metisMenu.min.css 304 1.264 ms - -
    GET /css/sb-admin-2.css 304 0.955 ms - -
    GET /css/morris.css 304 0.739 ms - -
    GET /css/font-awesome.min.css 304 1.277 ms - -
    ....
    

    这表明它的路线正常。 /。都很好。 / 路由现在表示在渲染 html(仅位于 /)时获取所有这些 js 文件。这些都是 304,因为它们永远不会改变。您发送文件的方式可能有错误。

    【讨论】:

      【解决方案2】:

      已解决:令人惊讶的是,问题是由视图中的代码引起的。

      这是我之前和之后的技巧:

      在下面使用 Angular.js 之前。
      注册.html

      <div class="col-xs-6" id="register">
          <p> Enter Username </p>
          <input type="text" ng-model="username"/>
          <p> Enter Password </p>
          <input type="text" ng-model="password"/>
          <input type="button" ng-click="register()">
      </div>
      

      controller.js

      $scope.register = function(){
          var send = {'username': $scope.username,
                      'password': $scope.password};
          $http.post('/signup', send);
      };
      

      我认为这不起作用的原因是浏览器不知道等待来自节点的响应。不是肯定的,但我最好的猜测是这个问题可以通过 Angular 中的 Promise 来解决。

      我通过将角度排除在等式之外并使用 html 中的表单处理 POST 来解决重定向问题。这是服务器端没有更改的工作代码:

      注册.html

       <form action="/signup" method="post"> 
           <input type="text" name="username" />
           <input type="text" name="password" />
           <button type="submit" id="enter" value="ENTER" />
       </form>
      

      【讨论】:

      • 您的问题是您希望浏览器在您使用 AJAX 登录时重定向。这不会发生。 AJAX 调用将跟随重定向并接收呈现的 HTML 页面,并且很可能存在错误,但您在 $http.post() 中没有错误处理,因此不会显示。检查此以获取更多信息stackoverflow.com/questions/26019995/…
      猜你喜欢
      • 1970-01-01
      • 2013-09-19
      • 2017-05-15
      • 2021-07-19
      • 2011-08-19
      • 2018-06-02
      • 2015-09-07
      • 2016-06-13
      • 2018-10-15
      相关资源
      最近更新 更多