refactor: migrate entire project to TypeScript

This commit is contained in:
2026-02-06 14:44:14 +08:00
parent e98dbcb0f4
commit a80c479027
14 changed files with 1141 additions and 462 deletions

View File

@@ -1,46 +0,0 @@
const jwt = require('jsonwebtoken');
const db = require('../utils/database');
// 验证JWT令牌
const authenticateToken = async (req, res, next) => {
// 从请求头获取令牌
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
return res.status(401).json({ error: '访问令牌缺失' });
}
try {
// 验证令牌
const decoded = jwt.verify(token, process.env.JWT_SECRET);
// 获取用户信息
const user = await db.get('SELECT id, username, name, role FROM users WHERE id = ?', [decoded.userId]);
if (!user) {
return res.status(401).json({ error: '用户不存在' });
}
req.user = user;
next();
} catch (error) {
if (error.name === 'TokenExpiredError') {
return res.status(401).json({ error: '令牌已过期' });
}
return res.status(403).json({ error: '无效的令牌' });
}
};
// 验证管理员权限
const requireAdmin = (req, res, next) => {
if (req.user.role !== 'admin') {
return res.status(403).json({ error: '需要管理员权限' });
}
next();
};
module.exports = {
authenticateToken,
requireAdmin
};

53
middleware/auth.ts Normal file
View File

@@ -0,0 +1,53 @@
import jwt from 'jsonwebtoken';
import { Request, Response, NextFunction } from 'express';
import db from '../utils/database';
import { AuthUser } from '../types';
declare global {
namespace Express {
interface Request {
user?: AuthUser;
}
}
}
export const authenticateToken = async (req: Request, res: Response, next: NextFunction): Promise<void> => {
const authHeader = req.headers['authorization'];
const token = authHeader && authHeader.split(' ')[1];
if (!token) {
res.status(401).json({ error: '访问令牌缺失' });
return;
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET!) as { userId: number; username: string; role: string };
const user = await db.get(
'SELECT id, username, name, role FROM users WHERE id = ?',
[decoded.userId]
) as AuthUser | undefined;
if (!user) {
res.status(401).json({ error: '用户不存在' });
return;
}
req.user = user;
next();
} catch (error: any) {
if (error.name === 'TokenExpiredError') {
res.status(401).json({ error: '令牌已过期' });
return;
}
res.status(403).json({ error: '无效的令牌' });
}
};
export const requireAdmin = (req: Request, res: Response, next: NextFunction): void => {
if (req.user?.role !== 'admin') {
res.status(403).json({ error: '需要管理员权限' });
return;
}
next();
};