Node Js 创建的会话问题(Express session)

我正在使用 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 });
    }
});
miaodidi 回答:Node Js 创建的会话问题(Express session)

您将 cookie: {expires: 60 * 60 * 24,}, 指定为快速会话选项。那是不正确的。 express-session 的文档说:“不应直接设置 expires 选项;而应仅使用 maxAge 选项。” 如果您确实使用了 expires(不管文档怎么说),它会需要是一个表示到期日期/时间的 Date 对象,而不是从现在开始的时间量。

而且,当您使用 maxAge 选项时,它必须以毫秒为单位指定。这可能是您应该使用的。

cookie: {maxAge: 1000 * 60 * 60 * 24},// expire session in 24 hours
本文链接:https://www.f2er.com/138.html

大家都在问