后端:
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