「遇见周大侠(网名:程序猿),长沙奥科领航信息技术公司的资深软件开发工程师。他的软件开发系列课件和项目,凝聚了多年的专业积累与热情。每套课件都包含丰富的案例和深入的知识点解析,每一讲都配备了精心设计的课后作业,旨在为热爱编程的你提供最佳编程实践。是教师备课的得力助手,是学生学习的贴心伴侣,亦是毕业设计的灵感源泉。现在,请搜索微信小程序「奥科领航信息技术 」,让我们一起深入代码的世界,探索无限可能!」
一、全局异常处理
// 全局异常处理中间件
app.use((err: Error, req: Request, res: Response, next: express.NextFunction) => {
if (err) {
console.log("发生了错误:" + err.message || err);
res.status(500).send("发生了错误:" + err.message || err);
} else {
next();
}
});
全局异常处理中间件需要放到其他路由的后面,即放到最后面。
二、JWT身份验证
2.1 安装依赖包
cnpm i jsonwebtoken --save
cnpm i @types/jsonwebtoken --save-dev
2.2 封装方法
(1)封装一个jwt的辅助方法,用于生成token和验证token的有效性。
src/utils/jwt.ts
// 导入依赖包
import * as jwt from "jsonwebtoken";
// 密钥
const key: string = "obtk";
// 过期时间,单位为秒。这里设置为2个小时
const expires: number = 60 * 60 * 2;
//生成token
const generateToken = (playload: object) => {
let token = jwt.sign({ name: playload.firstName }, key, { expiresIn: expires });
return token;
}
//验证token
const verityToken = (token: string) => {
try {
let tokenKey: any = jwt.verify(token, key);
return {
errMsg: "ok",
tokenKey
}
} catch {
return {
errMsg: "验证失败",
token
}
}
}
export { generateToken, verityToken };
(2)封装一个用于拦截HTTP请求的拦截器
src/utils/interceptor.ts
import { NextFunction, Request, Response } from 'express';
import * as jwt from './jwt';
export function preHandler(req: Request, res: Response, next: NextFunction) {
// 登录API不予验证
if (req.url != "/users/login") {
// 取出附加在headers中的token
let token: string = req.headers.token as string;
if (token) {
// 验证token是否有效
let result = jwt.verityToken(token);
if (result.errMsg == "ok") {
next();
} else {
res.status(401).send({
errMsg: "登录已过期,请重新登录"
});
}
} else {
res.status(402).send({
errMsg: "无访问权限,请先登录",
});
}
} else {
next();
}
}
2.3 用户登录
2.3.1 控制器
src/controller/UserController.ts
async login(request: Request, response: Response, next: NextFunction) {
let user = new User();
user.firstName = "张";
user.lastName = "三";
user.age = 18;
return {
token: jwt.generateToken(user)
}
}
2.3.2 路由
src/route/UserRoute.ts
{
method: "post",
route: "/users/login",
controller: UserController,
action: "login"
}
2.4 Apifox测试
post:/users/login,看能不能返回一个token
(2)访问其他API
GET: /users
本文暂时没有评论,来添加一个吧(●'◡'●)