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

时间:2021-08-02 00:04:47

标签: javascript node.js reactjs express 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, 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 });
    }
});

1 个答案:

答案 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