Удалить сессию в Express js - PullRequest
0 голосов
/ 21 октября 2018

Как я могу удалить сеанс после обновления до БД?

Я использовал express.js в качестве моего бэкенда, и я создал страницу входа.

это мой код для сеанса всервер / маршруты / api / signin.js:

/*
  * Logout
  */
 app.get('/api/account/logout', (req, res, next) => {
   //get the token
  const { query } = req;
  const { token } = query;

  UserSession.findOneAndUpdate({
    _id: token,
      isDeleted: false
    }, {
      $set: {
        isDeleted: true
      }
    }, null, (err, sessions) => {
      if(err) {
        return res.send({
          success: false,
          message: 'Error: Server error'
        });
      }
      return res.send({
        success: true,
        message: 'Good'
      });
    });
 });

но после того, как я войду и выйду.я не могу зайти на страницу входа снова.поэтому я должен очистить кеш из своего браузера, а затем снова получить доступ к своей странице входа.Кто-нибудь знает эту проблему?

, и это моя функция в клиенте / приложение / компоненты / Home / Home.js для выхода из системы:

logout() {
    this.setState({
      isLoading: true,
    });
    const obj = getFromStorage('the_main_app');
    if (obj && obj.token) {
      const {token} = obj;
      //verify token
      fetch('/api/account/logout?token=' + token)
        .then(res => res.json())
        .then(json => {
          if (json.success) {
            this.setState({
              token: '',
              isLoading: false
            });
          } else {
            this.state({
              isLoading: false,
            });
          }
        });
    } else {
      this.setState({
        isLoading: false,
      });
    }
  }

Страница входа в систему:

import React, { Component } from 'react';
import 'whatwg-fetch';
import { Link } from 'react-router-dom';
import { Button } from 'react-bootstrap';

import {
  getFromStorage,
  setInStorage
} from '../../utils/storage';

class Login extends Component {
  constructor(props) {
    super(props);

    this.state = {
      isLoading: true,
      token: '',
      signInError: '',
      signInEmail: '',
      signInPassword: '',
    };

    this.onTextboxChangeSignInEmail = this.onTextboxChangeSignInEmail.bind(this);
    this.onTextboxChangeSignInPassword = this.onTextboxChangeSignInPassword.bind(this);
    this.onSignIn = this.onSignIn.bind(this);
  }

  componentDidMount() {
    const obj = getFromStorage('the_main_app');
    if (obj && obj.token) {
      const {token} = obj;
      //verify token
      fetch('/api/account/verify?token=' + token)
        .then(res => res.json())
        .then(json => {
          if (json.success) {
            this.setState({
              token,
              isLoading: false
            });
          } else {
            this.state({
              isLoading: false,
            });
          }
        });
    } else {
      this.setState({
        isLoading: false,
      });
    }
  }

  onTextboxChangeSignInEmail(event) {
    this.setState({
      signInEmail: event.target.value,
    });
  }

  onTextboxChangeSignInPassword(event) {
    this.setState({
      signInPassword: event.target.value,
    });
  }

  onSignIn() {
    //Grab state and post request to backend
    const {
      signInEmail,
      signInPassword
    } = this.state;

    this.setState({
      isLoading: true,
    });

    // POST request to backend
    fetch('/api/account/signin', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        email: signInEmail,
        password: signInPassword,
      }),
    }).then(res => res.json())
      .then(json => {
        if (json.success) {
          setInStorage('the_main_app', { token: json.token });
          this.setState({
            signInError: json.message,
            isLoading: false,
            signInEmail,
            signInPassword,
            token: json.token,
          });
        } else {
          this.setState({
            signInError: json.message,
            isLoading: false,
          });
        }
      });

  }

  render() {
    const {
      isLoading,
      token,
      signInError,
      signInEmail,
      signInPassword,
    } = this.state;

    if (isLoading){
      return (<div><p>Loading...</p></div>);
    }

    if (!token) {
      return (
        <div>
          <div className="the-form">
            {
              (signInError) ? (
                <p>{ signInError }</p>
              ) : (null)
            }
            <center>
              <div className="sign-in container">
                <div className="panel panel-default">
                  <div className="panel-heading">
                    <h3 className="panel-title">
                      Sign In
                    </h3>
                  </div>
                  <div className="panel-body">
                    <div className="form-group">
                      <label htmlFor="email">Email:</label>                  
                      <input type="email" className="form-control" placeholder="Email" value={ signInEmail } onChange={ this.onTextboxChangeSignInEmail } />                
                    </div>
                    <div className="form-group">
                      <label htmlFor="password">Password:</label>                  
                      <input type="password" className="form-control" placeholder="Password" value={ signInPassword } onChange={ this.onTextboxChangeSignInPassword } />                                  
                    </div>
                    <Button bsStyle="primary" onClick={ this.onSignIn }>Sign In</Button>
                    <button className="btn btn-default" ><Link to="/signup">Register</Link></button>
                  </div>                
                </div>
              </div>
            </center>
          </div>
        </div>
      );
    }

    return (
      <div>
        <center>
          <alert>Login success!</alert><br/>
          <button className="btn btn-default" ><Link to="/">&larr; Go Back</Link></button>
        </center>
      </div>
    );
  }
}

export default Login;

1 Ответ

0 голосов
/ 21 октября 2018

В вашем выходе из системы вы должны добавить команду для удаления токена из вашего хранилища.

logout() {
    this.setState({
      isLoading: true,
    });
    const obj = getFromStorage('the_main_app');
    if (obj && obj.token) {
      const {token} = obj;
      //verify token
      fetch('/api/account/logout?token=' + token)
        .then(res => res.json())
        .then(json => {
          if (json.success) {
            // Add your command to delete token from local storage
            // Source : https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem
            this.setState({
              token: '',
              isLoading: false
            });
          } else {
            this.state({
              isLoading: false,
            });
          }
        });
    } else {
      this.setState({
        isLoading: false,
      });
    }
  }

Я обычно использую localStorage.removeItem('Key_Name_You_Want_to_Remove').Дополнительную информацию читайте здесь: https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem

Если вы используете какую-либо библиотеку или утилиту, вы можете найти ее, может быть, другой.

...