node.js - 尝试使用 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);
}
})
解决方案
在添加 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
}
});
推荐阅读
- javascript - javascript 当我尝试使用数组时,它显示未定义
- html - 如何从我的网站页面顶部删除空白
- python - Python GridSearchCV smote 优化错误
- javascript - 如何在 HTML 代码中使用 OAuth Token 解决错误
- sql-server - 我的 SQL 更新导致索引空间分配错误,因为文件组已满 - 但我知道我的更新不会影响索引
- python - Python:即使我正在查看索引为 0 的元素,列表索引也超出范围
- system-verilog - UVM中的工厂覆盖参数化类
- apache-zookeeper - Zookeeper 领导崩溃后状态不一致?
- c# - 使用 Ml.net 包错误“System.ArgumentOutOfRangeException”
- plugins - 在 CKAN 中创建数据故事