重构代码

时间:2018-04-02 21:54:47

标签: javascript node.js express passport.js

我使用node.js, mongoose, express & passport作为前端,使用.ejs构建RESTful应用。我正在尝试用护照添加身份验证。使用当前代码,我可以注册新用户,但新用户不会保持登录状态,并且在创建用户后,我无法登录进行需要授权的活动。似乎没有持久的用户。我也在使用express-session

我搜索过类似的问题,但任何“修复”似乎都没有帮助。我在具有相同堆栈的类似应用程序中具有几乎相同的代码...主要区别在于资源的名称(例如,比赛而不是项目)

这将是我使用过护照的第三个应用程序,所以它不是100%新的,并且具有类似/相同的代码,它已经在我的本地安装上工作。在这种情况下,它工作正常,包括显示和隐藏我的.ejs文件中的登录/注销按钮。

然后我重构了这些路线,现在我根本无法获得护照。 我已经比较了代码,将auth路由放回到app.js文件中,尝试在登录时登录req.user,然后登录并且它将不再起作用......没有护照路径似乎发挥作用。

我已经从我的package.json文件重新安装了节点模块,复制并放大了粘贴了以前工作文件中的护照设置,req.user始终未定义,我无法注册新用户。

我基本上重新安装了所有的护照,没有删除auth文件和app.js行并重新启动......但我应该能够在不删除内容的情况下解决这个问题。

可悲的是,我没有在重构之前保存一个版本。 :(

在我之前运行良好的情况下重构路线文件之后,为什么会出现这种情况的任何建议?据我所知,我重构了重构之前的事情。

这是我的app.js护照设置

//setup passport
app.use(require("express-session")({
  secret: "Fig is the best puppy ever",
  resave: false,
  saveUninitialized: false
}))


app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.use(function(req, res, next){
  console.log("Current User: " + req.user)
  res.locals.currentUser = req.user;
  next();
});

和我的身份验证路线:

//Authentication Routes
//show signup form
app.get('/register', function(req,res){
  res.render("register")
})


//user signup
app.post("/register", function(req,res){
  //res.send("Signing you up")
  console.log(req.body)
  var newUser = new User({username: req.body.username})
  User.register(newUser, req.body.password, function(err, user){
    if(err) {
      console.log(err);
      return res.render('register')
    } else {
      passport.authenticate("local")(req,res, function(){
        console.log("Created new user")
        res.redirect("/projects")
      })
    }
  })
})

//LOGIN ROUTES
//render login form
app.get("/login", function(req,res){
  res.render("login")
})

app.post("/login", passport.authenticate("local",
  {
    successRedirect: "/projects",
    failureRedirect: "/login"
  }), function(req,res) {
  // console.log("Logged in" +currentUser)
  // res.redirect("/projects")
})

//Logout Routes
app.get("/logout", function(req,res) {
  req.logout()
  res.redirect("/projects")
})

2 个答案:

答案 0 :(得分:1)

您似乎错过了req.login对身份验证的调用。尝试将此添加到您的注册中间件中的else

passport.authenticate("local")(req, res, function() {
  req.login(user, function(err) {
    if (err) {
      console.log(err);
      res.redirect('/register');
    } else {
      res.redirect('/projects')
    }
  })
})

答案 1 :(得分:0)

OP解决方案。

通过重新排序我的路线要求和护照设置来解决。正确的顺序如下。

//setup passport
app.use(require("express-session")({
  secret: "Fig is the best puppy ever",
  resave: false,
  saveUninitialized: false
}))


app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

//I MOVED THESE LINES TO BELOW THE PASSPORT SETUP
// Route setup
app.use("/users", userRoutes)
app.use(authRoutes)