返回

Node.js + Express + Docker + MySQL + JWT:构建用户管理RESTful API

前端

引言

RESTful API是一种流行的应用程序编程接口(API),它遵循代表性状态转移(REST)的原则。RESTful API使用统一的资源标识符(URI)来标识资源,并使用标准的HTTP方法(如GET、POST、PUT和DELETE)来操纵这些资源。

在本文中,我们将使用Node.js和Express框架来构建一个简单的用户管理RESTful API。我们将使用MySQL作为数据库,并使用JWT(JSON Web令牌)来处理用户身份验证和授权。最后,我们将使用Docker来容器化和部署应用程序。

先决条件

在开始之前,您需要确保您的系统满足以下先决条件:

  • Node.js 12或更高版本
  • Express框架
  • MySQL数据库服务器
  • Docker引擎

设置项目

首先,我们需要创建一个新的Node.js项目。您可以使用以下命令:

mkdir user-management-api
cd user-management-api
npm init -y

接下来,我们需要安装必要的依赖项。您可以使用以下命令:

npm install express mysql2 body-parser jsonwebtoken

创建数据库

接下来,我们需要创建一个MySQL数据库。您可以使用以下命令:

mysql -u root -p
CREATE DATABASE user_management_api;

定义模型

接下来,我们需要定义我们的用户模型。我们将使用Sequelize ORM来简化与MySQL数据库的交互。您可以使用以下命令安装Sequelize:

npm install sequelize

接下来,我们需要创建一个Sequelize模型文件。您可以使用以下命令创建文件:

touch models/user.js

然后,您可以将以下代码添加到文件中:

const Sequelize = require('sequelize');

const sequelize = new Sequelize('user_management_api', 'root', 'password', {
  host: 'localhost',
  dialect: 'mysql'
});

const User = sequelize.define('user', {
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true
  },
  username: {
    type: Sequelize.STRING,
    allowNull: false
  },
  password: {
    type: Sequelize.STRING,
    allowNull: false
  }
});

User.sync();

module.exports = User;

编写API端点

接下来,我们需要编写API端点。我们将使用Express框架来创建API端点。您可以使用以下命令创建API端点文件:

touch routes/users.js

然后,您可以将以下代码添加到文件中:

const express = require('express');
const router = express.Router();
const User = require('../models/user');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

// 用户注册
router.post('/register', async (req, res) => {
  const { username, password } = req.body;

  const hashedPassword = await bcrypt.hash(password, 10);

  const user = await User.create({
    username,
    password: hashedPassword
  });

  res.json({
    message: '用户注册成功',
    data: user
  });
});

// 用户登录
router.post('/login', async (req, res) => {
  const { username, password } = req.body;

  const user = await User.findOne({
    where: {
      username
    }
  });

  if (!user) {
    return res.status(404).json({
      message: '用户不存在'
    });
  }

  const isPasswordValid = await bcrypt.compare(password, user.password);

  if (!isPasswordValid) {
    return res.status(401).json({
      message: '密码错误'
    });
  }

  const token = jwt.sign({
    id: user.id,
    username: user.username
  }, 'secret', {
    expiresIn: '1h'
  });

  res.json({
    message: '用户登录成功',
    data: {
      token
    }
  });
});

// 获取用户信息
router.get('/profile', async (req, res) => {
  const token = req.headers['authorization'];

  if (!token) {
    return res.status(401).json({
      message: '未授权'
    });
  }

  const decodedToken = jwt.verify(token, 'secret');

  const user = await User.findByPk(decodedToken.id);

  if (!user) {
    return res.status(404).json({
      message: '用户不存在'
    });
  }

  res.json({
    message: '获取用户信息成功',
    data: user
  });
});

module.exports = router;

容器化和部署应用程序

接下来,我们需要使用Docker来容器化和部署应用程序。您可以使用以下命令创建Dockerfile文件:

touch Dockerfile

然后,您可以将以下代码添加到文件中:

FROM node:12

WORKDIR /usr/src/app

COPY package.json .

RUN npm install

COPY . .

CMD ["npm", "start"]

接下来,您可以使用以下命令构建Docker镜像:

docker build -t user-management-api .

最后,您可以使用以下命令运行Docker容器:

docker run -p 3000:3000 user-management-api

结论

在本文中,我们介绍了如何使用Node.js、Express、Docker、MySQL和JWT来构建一个简单的用户管理RESTful API。我们介绍了如何设置项目、创建数据库、定义模型、编写API端点,以及如何使用Docker容器化和部署应用程序。