我正在使用 React JS、Node JS(Express、Express-session、cookieParser、bodyParser、express-vaidator、pg、bcrypt 和 cors)和 PostgresSQL 创建登录系统!我正在尝试创建会话以保存来自用户的数据并控制访问权限,但不应在浏览器中查看会话
这是我的路线的代码:
app.post('/login',[
body("emailInput").isEmail().normalizeEmail().withMessage('Este não é um email válido'),
body("senhaInput").isLength({min: 8, max: 16}).trim().withMessage('Sua senha precisa ter entre 8 e 16 caracteres')
], (req, res) => {
const senha = req.body.senhaInput;
const email = req.body.emailInput;
const errors = validationResult(req);
if(!errors.isEmpty()){
return res.json({errors: errors.array()} )
}
loginUser(email, senha, (result, rows) => {
console.log(rows);
req.session.user = rows;
console.log("session", req.session.user);
res.send(rows)
})
})
这是登录用户函数的代码:
function loginUser(email, senha, callback) { //Função responsável de verificar se o usuário pode executar o login
pool.connect((error, client, release) => {
if (error) { //Se houver erro na conexão retorna o erro completo
return console.error('Erro na conexão: ', error)
} else {
}
client.query(`SELECT * FROM usuarios WHERE email = '${email}';`, (error, result) => {
release()
if (error) { //Se houver erro na execução da query retorna o erro completo
console.error('Erro na execução da query: ', error.stack)
} else {
if(result.rows.length > 0){
bcrypt.compare(senha, result.rows[0].senha, (error, responseCompare) => {
if(responseCompare){
callback(responseCompare, result.rows)
} else {
callback(responseCompare)
}
})
}
}
})
})
}
这是 express 的预设:
const app = express();
app.use(express.json());
app.use(cors({
origin: ['http://localhost:3000'],
methods: ['GET', 'POST'],
credentials: true
}));
app.use(cookieParser());
app.use(express.urlencoded({ extended: true }));
app.use(session({
key: "userId",
secret: "subscribe",
resave: false,
saveUninitialized: false,
cookie: {
expires: 60 * 60 * 24,
},
})
);
数据库通信保持工作,验证也是如此。
这是提交我的登录表单的功能:
function handleFormSubmit(event){
event.preventDefault();
console.log(campos)
axios.post('http://localhost:3030/login', campos).then(response => {
if (response.data.errors) {
console.table(response.data.errors)
response.data.errors.map(errorAtual => {
if(errorAtual.param === 'senhaInput'){
setSenhaError(errorAtual.msg)
} else {
setEmailError(errorAtual.msg)
}
})
} else {
setEmailError('')
setSenhaError('')
console.log(response.data)
}
})
}
此代码用于从“/login”中的 GET 接收响应
useEffect(() => {
axios.get("http://localhost:3030/login").then((response) => {
console.log(response.data)
});
}, []);
问题来了!这个函数总是返回{loggedIn:false}!
app.get("/login", (req, res) => {
if (req.session.user) {
res.send({ loggedIn: true, user: req.session.user });
} else {
res.send({ loggedIn: false });
}
});
答案 0 :(得分:0)
您将 cookie: {expires: 60 * 60 * 24,},
指定为快速会话选项。那是不正确的。 express-session 的文档说:“不应直接设置 expires 选项;而应仅使用 maxAge 选项。” 如果您确实使用了 expires(不管文档怎么说),它会需要是一个表示到期日期/时间的 Date 对象,而不是从现在开始的时间量。
而且,当您使用 maxAge
选项时,它必须以毫秒为单位指定。这可能是您应该使用的。
cookie: {maxAge: 1000 * 60 * 60 * 24}, // expire session in 24 hours