我正在使用 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,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,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",res) => {
if (req.session.user) {
res.send({ loggedIn: true,user: req.session.user });
} else {
res.send({ loggedIn: false });
}
});