本节课我们来通过koa来完成一个简单的登录,注册功能,后台使用mysql
- 初始化项目并安装依赖
- koa: Koa2框架
- koa-router: 处理路由的中间件
- koa-bodyparser: 解析请求体
- koa-session: 处理用户会话
- mysql2: MySQL连接
- bcrypt: 密码哈希
csharp
npm -y init
yarn add koa koa-router koa-bodyparser koa-session mysql2 bcrypt
- 创建数据库
- 如果之前没有用docker创建过mysql,进行创建
css
docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:5.7.27
- 我们使用docker启动Mysql,之前有提到过,我们直接启动
sql
docker start mysql1
docker exec -it mysql1 bash
mysql -uroot -p123456
- 运行脚本,来建库建表
sql
CREATE DATABASE IF NOT EXISTS MyEnglishLearningApp;
USE MyEnglishLearningApp;
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL
);
- 配置数据库连接
- db.js
php
const mysql = require('mysql2');
const pool = mysql.createPool({
host: 'your_database_host',
user: 'your_database_user',
password: 'your_database_password',
database: 'your_database_name',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
module.exports = pool.promise();
- 实现注册和登录路由
- 创建一个文件(例如authRoutes.js)来处理注册和登录路由:
js
// authRoutes.js
const Router = require('koa-router');
const bcrypt = require('bcrypt');
const db = require('./db');
const router = new Router();
router.post('/register', async (ctx) => {
const { username, password } = ctx.request.body;
// Hash the password before saving it
const hashedPassword = await bcrypt.hash(password, 10);
try {
const [result] = await db.query('INSERT INTO users (username, password) VALUES (?, ?)', [username, hashedPassword]);
ctx.body = { success: true, userId: result.insertId };
} catch (error) {
ctx.status = 500;
ctx.body = { success: false, error: error.message };
}
});
router.post('/login', async (ctx) => {
const { username, password } = ctx.request.body;
try {
const [rows] = await db.query('SELECT * FROM users WHERE username = ?', [username]);
if (rows.length === 0) {
ctx.body = { success: false, error: 'User not found' };
return;
}
const user = rows[0];
const passwordMatch = await bcrypt.compare(password, user.password);
if (passwordMatch) {
ctx.session.userId = user.id;
ctx.body = { success: true, userId: user.id };
} else {
ctx.body = { success: false, error: 'Invalid password' };
}
} catch (error) {
ctx.status = 500;
ctx.body = { success: false, error: error.message };
}
});
module.exports = router.routes();
- 使用路由
- 在主应用程序中使用上述路由:
js
// app.js
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const session = require('koa-session');
const authRoutes = require('./authRoutes');
const app = new Koa();
app.keys = ['your_secret_key']; // Change this to a secure random key
// Session configuration
app.use(session(app));
// Body parser middleware
app.use(bodyParser());
// Use auth routes
app.use(authRoutes);
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
- 启动应用
- node-dev app.js,这样会在修改代码后自动重启
- 添加.gitignore,提交代码
bash
# Node.js
node_modules/
# Logs
logs
*.log
npm-debug.log*
# Environment
.env
# Output
dist/
build/
# OS-generated files
.DS_Store
Thumbs.db
.idea
- 使用postman来模拟注册和登录,以及登录mysql验证
- 注册
- 登录
- 后续需要完善的
- 统一封装返回状态码
- 登录成功后增加记录登录状态的方式