Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js passport.js挂在一些帖子上_Node.js_Express_Passport.js - Fatal编程技术网

Node.js passport.js挂在一些帖子上

Node.js passport.js挂在一些帖子上,node.js,express,passport.js,Node.js,Express,Passport.js,我一直在搜索stackoverflow,寻找我的node.js(express)应用程序挂在passport.js上的原因 我一直在研究这两个问题: 我创建用户的代码运行良好,如下所示: passport.use('local-signup', new LocalStrategy({ // by default, local strategy uses username and password, we will override with email use

我一直在搜索stackoverflow,寻找我的node.js(express)应用程序挂在passport.js上的原因

我一直在研究这两个问题:

我创建用户的代码运行良好,如下所示:

passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            // if the user is not already logged in:
            if (!req.user) {

                User.findOne({
                    where: {
                        local_email: email
                    }
                }).then(function(user) {
                    if (user){
                        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                    }else{
                        // create the user
                        User
               .build({
                  local_email: email,
                              local_password: generateHash(password),
                              id: 1 //Normal activated user
               })
               .save()
               .then(newUser => {
                //Our newly crated user
                return done(null, newUser);
               })
               .catch(error =>{
               //Woops something went wrong 
               return done(error); 
               })

                        //var newUser            = new User();
                        //newUser.localemail    = email;
                        //newUser.localpassword = generateHash(password);

                        //User.create(newUser).then(function(newUser, created) {
                        //    if (!newUser) {
                        //        return done(err);
                        //    }
                        //    if (newUser) {
                        //        return done(null, newUser);
                        //    }
                        //});
                    }
                });
                // if the user is logged in but has no local account...
            } else if ( !req.user.local.email ) {
                // ...presumably they're trying to connect a local account
                // BUT let's check if the email used to connect a local account is being used by another user
                User.findOne({
                    where: {
                        localemail: email
                    }
                }).then(function(user) {
                    if (err)
                        return done(err);
                    if (user){
                        return done(null, false, req.flash('loginMessage', 'That email is already taken.'));
                        // Using 'loginMessage instead of signupMessage because it's used by /connect/local'
                    } else {
                        // create the user
                        var newUser            = new User();

                        newUser.local.email    = email;
                        newUser.local.password = generateHash(password);
                        User.create(newUser).then(function(newUser, created) {
                            if (!newUser) {
                                return done(err);
                            }
                            if (newUser) {
                                return done(null, newUser);
                            }
                        });
                    }
                });
            } else {
                // user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!)
                return done(null, req.user);
            }
        });
    }));
// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            User.findOne({
                where: {
                    local_email: email
                }
            }).then(function(user){
        console.log("TEST: "+user);
                // if no user is found, return the message
                if (!user){
        console.log("no user with the following email: " +email);
                    return done(null, false, req.flash('loginMessage', 'No user found.'));
                }else if(!validPassword(password,user.local_password)){
                    console.log("wrong password");
        return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
                // all is well, return user
                 }else{
                    return done(null, user);
        return;
          }
            }).catch(function(err){
        console.log("woops der skete en fejl: "+err);
        console.log("email is: "+email);
                console.log("password is: "+password); 
        return done(err);   
    });

        });

    }));
// process the login form
app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/login', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
在我的routs文件中,该函数的post如下所示:

passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            // if the user is not already logged in:
            if (!req.user) {

                User.findOne({
                    where: {
                        local_email: email
                    }
                }).then(function(user) {
                    if (user){
                        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                    }else{
                        // create the user
                        User
               .build({
                  local_email: email,
                              local_password: generateHash(password),
                              id: 1 //Normal activated user
               })
               .save()
               .then(newUser => {
                //Our newly crated user
                return done(null, newUser);
               })
               .catch(error =>{
               //Woops something went wrong 
               return done(error); 
               })

                        //var newUser            = new User();
                        //newUser.localemail    = email;
                        //newUser.localpassword = generateHash(password);

                        //User.create(newUser).then(function(newUser, created) {
                        //    if (!newUser) {
                        //        return done(err);
                        //    }
                        //    if (newUser) {
                        //        return done(null, newUser);
                        //    }
                        //});
                    }
                });
                // if the user is logged in but has no local account...
            } else if ( !req.user.local.email ) {
                // ...presumably they're trying to connect a local account
                // BUT let's check if the email used to connect a local account is being used by another user
                User.findOne({
                    where: {
                        localemail: email
                    }
                }).then(function(user) {
                    if (err)
                        return done(err);
                    if (user){
                        return done(null, false, req.flash('loginMessage', 'That email is already taken.'));
                        // Using 'loginMessage instead of signupMessage because it's used by /connect/local'
                    } else {
                        // create the user
                        var newUser            = new User();

                        newUser.local.email    = email;
                        newUser.local.password = generateHash(password);
                        User.create(newUser).then(function(newUser, created) {
                            if (!newUser) {
                                return done(err);
                            }
                            if (newUser) {
                                return done(null, newUser);
                            }
                        });
                    }
                });
            } else {
                // user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!)
                return done(null, req.user);
            }
        });
    }));
// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            User.findOne({
                where: {
                    local_email: email
                }
            }).then(function(user){
        console.log("TEST: "+user);
                // if no user is found, return the message
                if (!user){
        console.log("no user with the following email: " +email);
                    return done(null, false, req.flash('loginMessage', 'No user found.'));
                }else if(!validPassword(password,user.local_password)){
                    console.log("wrong password");
        return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
                // all is well, return user
                 }else{
                    return done(null, user);
        return;
          }
            }).catch(function(err){
        console.log("woops der skete en fejl: "+err);
        console.log("email is: "+email);
                console.log("password is: "+password); 
        return done(err);   
    });

        });

    }));
// process the login form
app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/login', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
但是,我的登录代码没有那么好用。passport.js中的函数如下所示:

passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            // if the user is not already logged in:
            if (!req.user) {

                User.findOne({
                    where: {
                        local_email: email
                    }
                }).then(function(user) {
                    if (user){
                        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                    }else{
                        // create the user
                        User
               .build({
                  local_email: email,
                              local_password: generateHash(password),
                              id: 1 //Normal activated user
               })
               .save()
               .then(newUser => {
                //Our newly crated user
                return done(null, newUser);
               })
               .catch(error =>{
               //Woops something went wrong 
               return done(error); 
               })

                        //var newUser            = new User();
                        //newUser.localemail    = email;
                        //newUser.localpassword = generateHash(password);

                        //User.create(newUser).then(function(newUser, created) {
                        //    if (!newUser) {
                        //        return done(err);
                        //    }
                        //    if (newUser) {
                        //        return done(null, newUser);
                        //    }
                        //});
                    }
                });
                // if the user is logged in but has no local account...
            } else if ( !req.user.local.email ) {
                // ...presumably they're trying to connect a local account
                // BUT let's check if the email used to connect a local account is being used by another user
                User.findOne({
                    where: {
                        localemail: email
                    }
                }).then(function(user) {
                    if (err)
                        return done(err);
                    if (user){
                        return done(null, false, req.flash('loginMessage', 'That email is already taken.'));
                        // Using 'loginMessage instead of signupMessage because it's used by /connect/local'
                    } else {
                        // create the user
                        var newUser            = new User();

                        newUser.local.email    = email;
                        newUser.local.password = generateHash(password);
                        User.create(newUser).then(function(newUser, created) {
                            if (!newUser) {
                                return done(err);
                            }
                            if (newUser) {
                                return done(null, newUser);
                            }
                        });
                    }
                });
            } else {
                // user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!)
                return done(null, req.user);
            }
        });
    }));
// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            User.findOne({
                where: {
                    local_email: email
                }
            }).then(function(user){
        console.log("TEST: "+user);
                // if no user is found, return the message
                if (!user){
        console.log("no user with the following email: " +email);
                    return done(null, false, req.flash('loginMessage', 'No user found.'));
                }else if(!validPassword(password,user.local_password)){
                    console.log("wrong password");
        return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
                // all is well, return user
                 }else{
                    return done(null, user);
        return;
          }
            }).catch(function(err){
        console.log("woops der skete en fejl: "+err);
        console.log("email is: "+email);
                console.log("password is: "+password); 
        return done(err);   
    });

        });

    }));
// process the login form
app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/login', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
相应的路由如下所示:

passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            // if the user is not already logged in:
            if (!req.user) {

                User.findOne({
                    where: {
                        local_email: email
                    }
                }).then(function(user) {
                    if (user){
                        return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
                    }else{
                        // create the user
                        User
               .build({
                  local_email: email,
                              local_password: generateHash(password),
                              id: 1 //Normal activated user
               })
               .save()
               .then(newUser => {
                //Our newly crated user
                return done(null, newUser);
               })
               .catch(error =>{
               //Woops something went wrong 
               return done(error); 
               })

                        //var newUser            = new User();
                        //newUser.localemail    = email;
                        //newUser.localpassword = generateHash(password);

                        //User.create(newUser).then(function(newUser, created) {
                        //    if (!newUser) {
                        //        return done(err);
                        //    }
                        //    if (newUser) {
                        //        return done(null, newUser);
                        //    }
                        //});
                    }
                });
                // if the user is logged in but has no local account...
            } else if ( !req.user.local.email ) {
                // ...presumably they're trying to connect a local account
                // BUT let's check if the email used to connect a local account is being used by another user
                User.findOne({
                    where: {
                        localemail: email
                    }
                }).then(function(user) {
                    if (err)
                        return done(err);
                    if (user){
                        return done(null, false, req.flash('loginMessage', 'That email is already taken.'));
                        // Using 'loginMessage instead of signupMessage because it's used by /connect/local'
                    } else {
                        // create the user
                        var newUser            = new User();

                        newUser.local.email    = email;
                        newUser.local.password = generateHash(password);
                        User.create(newUser).then(function(newUser, created) {
                            if (!newUser) {
                                return done(err);
                            }
                            if (newUser) {
                                return done(null, newUser);
                            }
                        });
                    }
                });
            } else {
                // user is logged in and already has a local account. Ignore signup. (You should log out before trying to create a new account, user!)
                return done(null, req.user);
            }
        });
    }));
// process the signup form
app.post('/signup', passport.authenticate('local-signup', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
    },
    function(req, email, password, done) {
        if (email)
            email = email.toLowerCase(); // Use lower-case e-mails to avoid case-sensitive e-mail matching

        // asynchronous
        process.nextTick(function() {
            User.findOne({
                where: {
                    local_email: email
                }
            }).then(function(user){
        console.log("TEST: "+user);
                // if no user is found, return the message
                if (!user){
        console.log("no user with the following email: " +email);
                    return done(null, false, req.flash('loginMessage', 'No user found.'));
                }else if(!validPassword(password,user.local_password)){
                    console.log("wrong password");
        return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.'));
                // all is well, return user
                 }else{
                    return done(null, user);
        return;
          }
            }).catch(function(err){
        console.log("woops der skete en fejl: "+err);
        console.log("email is: "+email);
                console.log("password is: "+password); 
        return done(err);   
    });

        });

    }));
// process the login form
app.post('/login', passport.authenticate('local-login', {
    successRedirect : '/', // redirect to the secure profile section
    failureRedirect : '/login', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));
提交表单时,上述代码挂起。如果我将代码更改为:

app.post('/login', function(req, res, next) {
    passport.authenticate('local-login', function(err, user, info) {
      if (err) { return next(err); }
      if (!user) {
        return res.render('/login', {
          pageTitle: 'Sign in',
          form: req.body
        });
      }
      req.logIn(user, function(err) {
        if (err) { return next(err); }
        return res.redirect('/');
      });
    })(req, res, next);
});
我收到一张500英镑的支票。 你知道我为什么不工作吗

使用控制台输出更新:

Executing (default): SELECT `id`, `role`, `local_email`, `local_password`, `facebook_id`, `facebook_token`, `facebook_email`, `facebook_name`, `twitter_id`, `twitter_token`, `twitter_displayname`, `twitter_username`, `google_id`, `google_token`, `google_email`, `google_name`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`local_email` = 'test@local' LIMIT 1;
TEST: [object SequelizeInstance:users]
POST /login 302 87.021 ms - 46
Executing (default): SELECT `id`, `role`, `local_email`, `local_password`, `facebook_id`, `facebook_token`, `facebook_email`, `facebook_name`, `twitter_id`, `twitter_token`, `twitter_displayname`, `twitter_username`, `google_id`, `google_token`, `google_email`, `google_name`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`id` = 1;
已使用更改的passport.deserializeUser更新

 passport.deserializeUser(function(id, done) {
        /*User.findById(id, function(err, user) {
            done(err, user);
        });*/
        User.findById(id).then(user => {
            if (!user){
                done(null);
            }else{
                done(user);
            }
        })
    });

您的
passport.deserializeUser
不正确。与所有Node.js回调一样,第一个参数是为错误保留的,如果没有任何错误,则应为
null
(或另一个falsy值)。在您的例子中,您将
user
作为第一个参数传递,这使Passport认为有错误

试试这个:

passport.deserializeUser(function(id, done) {
  User.findById(id)
      .then(user => done(null, user))
      .catch(done);
});

你在记录各种事情,它到底在哪里停止记录?你确定有有效的数据库连接吗?我已经用控制台输出更新了帖子。我很确定我有数据库连接,因为我可以创建用户,并且控制台输出显示正在执行的查询?看起来问题可能在您的
/
处理程序中(或者,可能是
passport.deserializeUser
),因为
POST/login
似乎发出了重定向。您是否使用XHR/AJAX/fetch(即通过代码而不是表单提交)调用
POST/login
?我不是使用AJAX来发布。我使用一个表单帖子:下一个可能的原因可能是
passport.deserializeUser
。非常感谢,这正是问题所在。再次非常详细和友好地帮助钻孔;)