Javascript 节点、Express 3和Passport:登录表单不工作

Javascript 节点、Express 3和Passport:登录表单不工作,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我是Node的新手,有一个Node、Express和Passport设置,似乎正在工作。也就是说,我没有看到任何错误消息 问题是,当我转到登录页面并尝试登录时,什么都没有发生。单击按钮后,页面将刷新,但未执行任何操作 我已将代码粘贴到下面 这是我提交表单时的终端输出: 08:19:53 web.1 | POST /login 302 3ms - 68 08:19:53 web.1 | GET /login 304 11ms 08:19:53 web.1 | GET /stylesheets

我是Node的新手,有一个Node、Express和Passport设置,似乎正在工作。也就是说,我没有看到任何错误消息

问题是,当我转到登录页面并尝试登录时,什么都没有发生。单击按钮后,页面将刷新,但未执行任何操作

我已将代码粘贴到下面

这是我提交表单时的终端输出:

08:19:53 web.1  | POST /login 302 3ms - 68
08:19:53 web.1  | GET /login 304 11ms
08:19:53 web.1  | GET /stylesheets/base.css 304 1ms
以下是登录视图(Jade):

以下是最初调用登录页面的代码(为了清晰起见,我拿出了其他东西):

app.js

app.get("/login", routes.login);
(function() {
  var Post;

  Post = require('../models/Post');

  module.exports = {
    login: function(req, res) {
      return res.render("login", {
        user: req.user,
        message: req.flash("Login error!"),
        title: "Login | David Yeiser"
      });
    }
  };

}).call(this);
routes/index.js

app.get("/login", routes.login);
(function() {
  var Post;

  Post = require('../models/Post');

  module.exports = {
    login: function(req, res) {
      return res.render("login", {
        user: req.user,
        message: req.flash("Login error!"),
        title: "Login | David Yeiser"
      });
    }
  };

}).call(this);
下面是app.js中处理帖子的部分:

app.post("/login", passport.authenticate("local", {
    failureRedirect: "/login",
    failureFlash: true
}), function(req, res) {
    return res.redirect("/office");
});
最后,这里是整个app.js

(function() {
  var LocalStrategy, app, express, findById, findByUsername, flash, http, mongoose, passport, path, routes, user, users, util;

  express = require('express');
  routes = require('./routes');
  user = require('./routes/user');
  http = require('http');
  path = require('path');
  mongoose = require('mongoose');
  passport = require('passport');
  flash = require('connect-flash');
  util = require('util');
  LocalStrategy = require('passport-local').Strategy;

  users = [
    {
      id: 1,
      username: 'bob',
      password: 'secret',
      email: 'bob@me.com',
      id: 2,
      username: 'nancy',
      password: 'secrettoo',
      email: 'nancy@me.com'
    }
  ];

  findById = function(id, fn) {
    var idx;
    idx = id - 1;
    if (users[idx]) {
      return fn(null, users[idx]);
    } else {
      return fn(new Error('User does not exist'));
    }
  };

  findByUsername = function(username, fn) {
    var i, len;
    i = 0;
    len = users.length;
    while (i < len) {
      user = users[i];
      if (user.username === username) {
        return fn(null, user);
      }
      i++;
    }
    return fn(null, null);
  };

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

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

  passport.use(new LocalStrategy(function(username, password, done) {
    return process.nextTick(function() {
      return findByUsername(username, function(err, user) {
        if (err) {
          return done(err);
        }
        if (!user) {
          return done(null, false, {
            message: "Unknown user " + username
          });
        }
        if (user.password !== password) {
          return done(null, false, {
            message: "Invalid password"
          });
        }
        return done(null, user);
      });
    });
  }));

  app = express();

  app.configure(function() {
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({
      secret: 'keyboard cat'
    }));
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    return app.use(express["static"](path.join(__dirname, 'public')));
  });

  app.configure('development', function() {
    mongoose.connect('mongodb://localhost/davidyeiser_dev');
    return app.use(express.errorHandler());
  });

  app.get("/", routes.index);

  app.get("/login", routes.login);

  app.post("/login", passport.authenticate("local", {
    failureRedirect: "/login",
    failureFlash: true
  }), function(req, res) {
    return res.redirect("/office");
  });

  app.get("/logout", function(req, res) {
    req.logout();
    return res.redirect("/");
  });

  app.get("/post/new", routes.newPost);
  app.post("/post/new", routes.addPost);
  app.get("/post/:id", routes.viewPost);
  app.get("/users", user.list);

  http.createServer(app).listen(app.get("port"), function() {
    return console.log("Express server listening on port " + app.get("port"));
  });

}).call(this);
(函数(){
var LocalStrategy、app、express、findById、findByUsername、flash、http、mongoose、passport、path、routes、user、users、util;
express=需要(“express”);
路由=需要('./路由');
用户=要求('./路线/用户');
http=require('http');
路径=要求(“路径”);
猫鼬=需要(“猫鼬”);
passport=需要(“passport”);
闪存=需要(“连接闪存”);
util=require('util');
LocalStrategy=require('passport-local')。策略;
用户=[
{
id:1,
用户名:“bob”,
密码:“secret”,
电邮:'bob@me.com',
id:2,
用户名:“nancy”,
密码:“secrettoo”,
电邮:'nancy@me.com'
}
];
findById=函数(id,fn){
var-idx;
idx=id-1;
如果(用户[idx]){
返回fn(空,用户[idx]);
}否则{
返回fn(新错误('用户不存在');
}
};
findByUsername=函数(用户名,fn){
变量i,len;
i=0;
len=用户长度;
而(我
您看到的大部分内容取自Passport Express 3示例:


我很感谢你能给我的任何帮助。

啊哈!用户数组构造不正确

  users = [
    {
      id: 1,
      username: 'bob',
      password: 'secret',
      email: 'bob@me.com',
      id: 2,
      username: 'nancy',
      password: 'secrettoo',
      email: 'nancy@me.com'
    }
  ];
需要:

  users = [
    {
      id: 1,
      username: 'bob',
      password: 'secret',
      email: 'bob@me.com'
    },
    {
      id: 2,
      username: 'nancy',
      password: 'secrettoo',
      email: 'nancy@me.com'
    }
  ];
我发现它的方式是,我只是减少到一个用户(在大约1000个其他东西中),然后最终意识到这是错误的。其他一切都保持不变


(我以前没有捕捉到它的原因是因为我每次都使用“bob”,从未想过尝试“nancy”)

经过更多测试后,它确实有一个操作,并且正在调用重定向回登录页面的失败响应,因此我感到困惑。当我将重定向更改为索引页时,它重定向到了那里。然而,仍然存在一些问题:-闪光信息没有出现-本地策略似乎没有启动,但我不确定如何衡量那里的有效行为。我把里面的函数名改成乱七八糟的,但知道抛出了错误,这让我怀疑。-我在谷歌上搜索了很多,但是没有看到任何人有同样的问题。也许我把Passport弄得太复杂了,应该用这个例子?以上链接来自Express常见问题解答: