Files

62 lines
1.8 KiB
JavaScript

const express = require('express');
const bcrypt = require('bcryptjs');
const db = require('../config/database');
const { generateToken } = require('../middleware/auth');
const { asyncHandler, AppError } = require('../middleware/errorHandler');
const router = express.Router();
// 注册
router.post('/register', asyncHandler(async (req, res) => {
const { username, password } = req.body;
if (!username || !password) {
throw new AppError('请填写用户名和密码', 400, 'MISSING_FIELDS');
}
if (username.length < 3 || username.length > 20) {
throw new AppError('用户名需3-20个字符', 400, 'INVALID_USERNAME');
}
if (password.length < 6 || password.length > 20) {
throw new AppError('密码需6-20个字符', 400, 'INVALID_PASSWORD');
}
const hashedPassword = await bcrypt.hash(password, 10);
const stmt = db.prepare('INSERT INTO users (username, password) VALUES (?, ?)');
const result = stmt.run(username, hashedPassword);
const token = generateToken(result.lastInsertRowid);
console.log(`User registered: ${username}`);
res.json({ token, username });
}));
// 登录
router.post('/login', asyncHandler(async (req, res) => {
const { username, password } = req.body;
if (!username || !password) {
throw new AppError('请填写用户名和密码', 400, 'MISSING_FIELDS');
}
const stmt = db.prepare('SELECT * FROM users WHERE username = ?');
const user = stmt.get(username);
if (!user) {
throw new AppError('用户名或密码错误', 400, 'INVALID_CREDENTIALS');
}
const validPassword = await bcrypt.compare(password, user.password);
if (!validPassword) {
throw new AppError('用户名或密码错误', 400, 'INVALID_CREDENTIALS');
}
const token = generateToken(user.id);
console.log(`User logged in: ${username}`);
res.json({ token, username: user.username });
}));
module.exports = router;