2017-01-28 22 views
0

申し訳ありませんがreq.userundefinedの理由はわかりませんが、ログイン時には表示されません。私はログインのためにほとんど同じことをしたと思った。登録後にreq.userが定義されていません

私はサインアップした後、dbでユーザーを取得し、jsonにreq.userを返し、nullを返します。

私の最終目標は、登録後に/ルートにリダイレクトすることです。 /ルートでは、req.userがヌルでないかどうかを調べて、ユーザーが認証されているかどうかについての適切なメッセージを表示したいと考えています。

const express = require("express"); 
const ejs = require("ejs") 
const bodyParser = require("body-parser"); 
// const multer = require("multer"); 
const mongoose = require("mongoose"); 
const app = express(); 

const User = require("./database/models/user"); 


const port = process.env.port || 3000; 

/**********Express session*********/ 
const expressSession = require("express-session"); 
/**********************************/ 
const passport = require("passport"); 
const localStrategy = require("passport-local").Strategy; 

mongoose.connect("mongodb://localhost/passport-ajax"); 
//Make sure capital P for promise. 
mongoose.Promise = global.Promise; 



app.use(bodyParser.urlencoded({extended : true})); 
app.use(bodyParser.json()); 
// app.use(multer({dest : "./uploads"})); 

app.use(expressSession({ 
    secret : "longString", 
    resave:false, 
    saveUninitialized: false 
})) 



/********************Configure passport*************************/ 


passport.use("login", new localStrategy({ 
    usernameField : "emailOrUsername", 
    passwordField : "password", 
    passReqToCallback : true 
}, 
    function(req, username, password, done){ 
     console.log("HIT HERE"); 
     User.findOne({emailOrUsername: username}) 
      .then((user)=>{ 
       console.log("FINDING!!"); 
       if(!user){ 
        console.log("My error: NO SUCH USER"); 
        return done(null, false, "No such user"); 
       } 
       if(password !== user.password){ 
        console.log(`Password Doesnt Match`); 
        done(null, false , "Passwords dont match"); 
       } 
       console.log("USER MATCHED!!"); 
       done(null, user) 

      }) 
      .catch((err) => console.log(err)); 
    } 
)) 

passport.use("signUp", new localStrategy({ 
    usernameField : "emailOrUsername", 
    passwordField : "password", 
    passReqToCallback : true 
}, 
    function(req, username, password, done){ 
     // Removing from the DB first so there won't be multiple records while testing. 
     User.remove({}) 
     .then(() =>{ 
      User.findOne({emailOrUsername : username}) 
       .then((user) => { 
        console.log("FINDING INSIDE SIGNUP"); 
        if(user){ 
         return done(null, false, "User "+ username + "allready exists. "); 
        } 
        var user = { 
         emailOrUsername : username, 
         password : password 
        }; 
        new User(user).save() 
         //possible do done(err) 
         .then((newUser) =>{ 
          if(!newUser) return done("Failed On Create User"); 
          done(null, user) 
         }) 
       }) 
     }) 
     .catch((err) => { 
      console.log(err); 
     }) 
    } 
)) 

function verifyAuth(req, res, next){ 
    if(!req.isAuthenticated()){ 
     return res.status(401).json({ 
      err : "Please login correctly. You received a 401 error.", 
      sesstionId : req.session.id 
     }) 
    } 
    next(); 
} 
app.use(passport.initialize()); 
app.use(passport.session()); 

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

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

/**************************************************************/ 


app.set("view engine", "ejs"); 

//file will be served like http://localhost:4000/style.css 
app.use(express.static(__dirname + "/public")); 

app.get("/", (req, res) => { 
    console.log("req.user : ", req.user); 
    console.log("session: ", req.session); 
    const authenticated = req.user ? true : false; 
    var query = req.query.message; 
    res.render("index", { 
     query, 
     authenticated 
    }) 
}) 

app.get("/signUp", (req, res) =>{ 
    res.render("signUp", { 
    }) 
}) 

app.post("/signUp", (req, res, next) => { 
    // console.log(req.body); 


    passport.authenticate("signUp", function(err, user, info){ 
     if(err) console.log(err, " authenticate Signup error! "); 
     if(!user) console.log("USER ERROR!"); 
     req.login(user, function(err) { 
      if(err) return err; 
      console.log("req.login called!") 

      console.log("INFO, " , info) 
     }) 
     // res.redirect("/"); 
     res.status(201).json({ 
      user : user, 
      session : req.session, 
      "req.user" : req.user // This is null right now. 
     }); 

    })(req, res, next) 
}, function(err, req, res, next){ 
    console.log("req.isAuthenticated() >", req.isAuthenticated()); 
}); 
app.get("/login", (req,res) =>{ 
    res.render("loginForm"); 
}); 

app.post("/login", function(req, res, next) { 
    console.log("req.body : ", req.body) 
    passport.authenticate("login", function(err, user, info){ 
     console.log("inside authenticate"); 
     if(err) console.log(err, " ", req.session.id); 
     if(!user) console.log("No user : ", info); 
     req.login(user, function(err) { // need this when using custom function 
      if(err) console.log(err); 
     }); 
     res.status(201).json({ 
      user : user, 
      session : req.session, 
      "req.user" : req.user 
     }); 
    })(req, res, next); // very import to call this self-executing function 
}, function(err, req, res, next){ 
    //possible function here 
}); 

app.get("/unProtected", (req, res) => { 
    res.json({ 
     session : req.session, 
     "req.user" : req.user 
    }) 
}) 
app.get("/protected", verifyAuth, (req, res) =>{ 
    res.json({ 
     session : req.session, 
     "req.user" : req.user 
    }); 
}); 


app.listen(port, function(){ 
    console.log(`Listening on port ${port}`); 
}) 
+0

'passport.usは何ですかe(「signUp」、「for? – hjpotter92

+0

これはパスポートを正しく使用する方法です。私は最初のパラメータは戦略の名前だと信じています。そして私が信じている機能は 'verify'関数と呼ばれます。それはパスポートを使って戦略を設定する方法です。 –

+0

申し訳ありませんが、私は意味しました。すでに '/ login'が定義されている場合、なぜ別のものを作成しますか? – hjpotter92

答えて

1

req.loginが非同期で動作するため、コールバック関数を渡す理由です。だから、このコールバックの内側にあなたはそれが設定だことに、それに十分な時間を与えるこのように、すべての応答を移動する必要があります。

req.login(user, function(err) { 
    if (err) return err; 
    console.log("req.login called!"); 
    console.log("INFO, ", info); 
    return res.status(201).json({ 
     user: user, 
     session: req.session, 
     "req.user": req.user 
    }); 
}); 

はまたpassport.use("signUp"...に、あなたはNEWUSERでコールバックを呼び出す必要があります:

var newUser = new User(user); 
newUser.save(function(err) { 
    if (err) throw err; 
    done(null, newUser); 
}); 

_idの代わりidを使用してユーザーをシリアライズ:

passpost.serializeUser(function(user, done) { 
    done(null, user._id); 
}); 
+0

私は前にそのようなことを試みました。それが助けになるかどうか今すぐ確認してみましょう。 –

+0

私はそれを入れて、今ブラウザがハングアップします。 if(!user)console.log( "USER ERROR(ユーザーエラー)");if(err)console.log(err、 "Authenticate Signup error!"); if ! "); req.login(user、function(err){ if(err)return err; console.log console.log(" INFO "、info) res.status(201).json({ ユーザー:ユーザー、 セッション:req.session、 "req.user":req.userは//これは今ヌルである 。}); }) ' –

+0

応答を返す – dNitro

関連する問題