首页 > 解决方案 > 尝试使用 Passport.js 和 AJAX 注册用户时,服务器返回“错误:无法将用户序列化到会话中”

问题描述

服务器在尝试使用 Passport.js 和 AJAX 使用注册用户时返回“错误:无法将用户序列化到会话中”。该代码在注册页面不使用 AJAX 时有效,但我也希望有一个处理注册的弹出窗口。

护照.js

var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;

var User = require('../models/user');

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

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

passport.use('local.popsignup', new LocalStrategy({
    usernameField: 'popUsername',
    passwordField: 'popPassword',
    passReqToCallback: true
}, (req, email, password, done) => {
   User.findOne({'email':email}, (err, user) => {

       if(err){
           return done(err);
       }

       if(user){
           return done(null, false, req.flash('error', 'Email already exists, please login.'))
       }

       var newUser = new User();
       newUser.email = email;
       newUser.password = newUser.encryptPassword(password);
       newUser.preferences = preferences;
       newUser.save((err) => {
           return done(null, newUser);
       });

   }); 
}));

用户路由器

module.exports = (app, passport) => {
    app.post('/popover', function(req, res, next) {
        passport.authenticate('local.popsignup', function(err, user, info) {
            if (user !== undefined) {loggedIn = true} else {loggedIn = false};
            var errors = req.flash('error')
            req.login(user, function(err) {
                if (err) return next(err);
                res.status(200).send({errors: errors, loggedIn: loggedIn});
            });
        })(req, res, next);
    });
}

查看ajax js

            $.ajax({
                url: "/popover",
                type: "POST",
                data: $('#popform-tag').serialize(),
                success: function(data){
                    if(data.loggedIn == false) {
                        $("#email_alert").text(data.errors[0]).show();
                    } else {
                        $('#popover').modal('hide')
                        localStorage.setItem('preferences', 1);
                    }
                    //console.log(data);
                },
                error: function(XMLHttpRequest, textStatus, errorThrown) {
                    console.log("Status: " + textStatus);
                    console.log("Error: " + errorThrown);
                }
            })

标签: node.jsajaxexpresspassport.js

解决方案


在添加 ajax 之前,通过 PostMan 发送一些参数以检查您的 API 请求响应是否按预期工作。如果是,则仅使用基于 API 类型(post、put 等)的 Ajax

也代替 serialize() 尝试以这种方式使用 Ajax -

var data = {
      someKey: 'someValue'
    }
    $.ajax({
        url: '/popover', // route path
        type: 'POST',
        data: JSON.stringify(data),
        headers: {
            'Content-Type': "application/json",
        },
        'success': function (data, textStatus, request) {
           // do something
                
             
        },
        'error': function (err) {
           // do some error handling
        }
    });

推荐阅读