问答

关于登录注册

作者:admin 2021-04-21 我要评论

后端: router 我在 auth.router.ts 加入了段返回当前用户的路由 /** * 返回当前用户 */router.get('/user', currentUser, authController.user) 中间件 用的你...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

后端:

router

我在 auth.router.ts 加入了段返回当前用户的路由

/** 
 * 返回当前用户
 */
router.get('/user', currentUser, authController.user)

中间件

用的你添加在 auth.middleware.ts 里

/**
 * 当前用户
 */
export const currentUser = (
  request: Request,
  response: Response,
  next: NextFunction,
) => {
  let user = {
    id: null,
    name: 'anonympus'
  };

  try {
    // 提取 Authorization
    const authorization = request.header('Authorization');

    // 提取 JWT 令牌
    const token = authorization.replace('Bearer ', '');

    if (token) {
      // 验证令牌
      const decoded = jwt.verify(token, PUBLIC_KEY, {
        algorithms: ['RS256'],
      });

      user = decoded as any;
    }
  } catch (error) { }

  // 在请求里添加当前用户
  request.user = user;

  next();
};

控制器

/**
 * 当前用户
 */
export const user = async (
  request: Request,
  response: Response,
  next: NextFunction,
) => {
  const Authorization = request.user;
  const user = Authorization


  try {
    response.send(user)

  } catch (error) {
    next(error)
  }
};

作用就是根据前端的 token 值给前端返回一个用户信息。

前端

app.service.ts. 给 axios 实例加了一句 headers

/**
 * axios 实例
 */

export const apiHttpClient = axios.create({
 baseURL: API_BASE_URL,
 headers: { Authorization: 'Bearer ' + localStorage.getItem('token') },
});

app.vue 里用了一下后端的 /user

script

  data() {
   return {
    user: null,
   };
  },

  async created() {
   const response = await apiHttpClient.get('/user');

   this.user = response.data;
  },

模版

<global-haeder :user="user" />

GlobalHaeder.vue 里有登录菜单

script

 props: ['user'],
  methods: {
   handleClick() {
    localStorage.removeItem('token');
    this.$router.push('/');
   },
  },

模版

    <ul v-if="!user" class="navbar-nav">
     <li class="nav-item px-1 py-1">
      <router-link
       type="button"
       to="/user/login"
       class="btn  btn-outline-primary"
       >登录</router-link
      >
     </li>
     <li class="nav-item px-1 py-1">
      <router-link type="button" to="/user/register" class="btn btn-primary"
       >注册</router-link
      >
     </li>
    </ul>

    <ul v-if="user" class="list-inline mb-0 px-5">
     <li class="nav-item dropdown" :title="user.name">
      <router-link
       class="nav-link dropdown-toggle"
       to="#"
       id="usersDropdown"
       role="button"
       data-toggle="dropdown"
       aria-haspopup="true"
       aria-expanded="false"
      >
       ![](@/assets/img/avatar.png)
       {{ user.name }}
      </router-link>
      <div class="dropdown-menu" aria-labelledby="usersDropdown">
       <router-link to="/posts/create" class="dropdown-item"
        >发布文章</router-link
       >
       <router-link to="#" class="dropdown-item">个人中心</router-link>
       <router-link to="#" class="dropdown-item">设置账户</router-link>
       <a href="javascript:void(0)" @click="handleClick" class="dropdown-item"
        >退出账户</a
       >
      </div>
     </li>
    </ul>

现在退出用户后,返回的是后端定义的这个

  let user = {
    id: null,
    name: 'anonympus'
  };

测试地址:
http://lejiaoku.lekee.cc 或者 http://lejiaoku.lekee.cc:8080

后端代码:
https://github.com/rockts/lej...

前端代码:
https://github.com/rockts/lej...

###

那你是想干嘛?

 let user = {
    id: null,
    name: 'anonympus'
  };

改成

 let user = null;

或者判断的时候 user 改成 user && user.id

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 关于登录注册

    关于登录注册

  • 在微信h5页面可以唤起、调用手机蓝牙么

    在微信h5页面可以唤起、调用手机蓝牙么

  • React 中路由跳转之后无法访问某个 coo

    React 中路由跳转之后无法访问某个 coo

  • 有什么办法可以判断一个坐标是wgs84还

    有什么办法可以判断一个坐标是wgs84还

腾讯云代理商
海外云服务器