Node.js实现MySQL数据库接口开发

IDC服务

Node.js实现MySQL数据库接口开发

2025-04-26 00:10


Node.js连接MySQL数据库开发RESTful API全攻略 ? 本教程将详细介绍如何使用Node.js创建接口并连接MySQL数据库,涵盖从环境搭建到安全部署的全过程。我们将使用Express框架和mysql2驱动,这是目前最稳定高效的Node.js MySQL解决方案。

                                            




Node.js连接MySQL数据库开发RESTful API全攻略 🚀

本教程将详细介绍如何使用Node.js创建接口并连接MySQL数据库,涵盖从环境搭建到安全部署的全过程。我们将使用Express框架和mysql2驱动,这是目前最稳定高效的Node.js MySQL解决方案。

一、环境准备与项目初始化

1. 系统要求检查

确保已安装:

  • Node.js 16+(推荐18 LTS)
  • MySQL 8.0+ 或 MariaDB 10.5+
  • npm 8+

检查版本:

node -v
mysql --version

2. 项目初始化

创建项目目录并初始化:

mkdir node-mysql-api && cd node-mysql-api
npm init -y

3. 安装核心依赖

npm install express mysql2 dotenv cors
npm install --save-dev nodemon

关键包说明:

  • express:Web框架
  • mysql2:支持Promise的MySQL驱动
  • dotenv:环境变量管理
  • cors:跨域支持
  • nodemon:开发热重载

二、MySQL数据库配置

1. 创建数据库与用户

CREATE DATABASE node_api;
CREATE USER 'api_user'@'localhost' IDENTIFIED BY 'strongpassword';
GRANT ALL PRIVILEGES ON node_api.* TO 'api_user'@'localhost';
FLUSH PRIVILEGES;

2. 创建示例表

USE node_api;

CREATE TABLE products (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  stock INT DEFAULT 0,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO products (name, price, stock) 
VALUES ('Laptop', 999.99, 10), ('Phone', 699.99, 15);

三、项目结构搭建

推荐结构:

├── .env
├── config/
│   └── db.js
├── controllers/
│   └── productController.js
├── routes/
│   └── productRoutes.js
├── app.js
└── package.json

四、核心代码实现

1. 数据库连接配置 (config/db.js)

const mysql = require('mysql2/promise');
require('dotenv').config();

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

module.exports = pool;

2. 环境变量配置 (.env)

DB_HOST=localhost
DB_USER=api_user
DB_PASSWORD=strongpassword
DB_NAME=node_api
PORT=3000

3. 控制器示例 (controllers/productController.js)

const pool = require('../config/db');

exports.getAllProducts = async (req, res) => {
  try {
    const [rows] = await pool.query('SELECT * FROM products');
    res.json(rows);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Database query failed' });
  }
};

exports.getProductById = async (req, res) => {
  try {
    const [rows] = await pool.query('SELECT * FROM products WHERE id = ?', [req.params.id]);
    if (rows.length === 0) {
      return res.status(404).json({ error: 'Product not found' });
    }
    res.json(rows[0]);
  } catch (err) {
    console.error(err);
    res.status(500).json({ error: 'Database query failed' });
  }
};

4. 路由配置 (routes/productRoutes.js)

const express = require('express');
const router = express.Router();
const productController = require('../controllers/productController');

router.get('/', productController.getAllProducts);
router.get('/:id', productController.getProductById);

module.exports = router;

5. 主应用文件 (app.js)

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const productRoutes = require('./routes/productRoutes');

const app = express();
const PORT = process.env.PORT || 3000;

// 中间件
app.use(cors());
app.use(express.json());

// 路由
app.use('/api/products', productRoutes);

// 错误处理
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'Something broke!' });
});

app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

五、高级功能实现 🔧

1. 事务处理示例

exports.createOrder = async (req, res) => {
  const conn = await pool.getConnection();
  try {
    await conn.beginTransaction();
  
    // 1. 检查库存
    const [product] = await conn.query(
      'SELECT stock FROM products WHERE id = ? FOR UPDATE', 
      [req.body.productId]
    );
  
    if (product[0].stock < req.body.quantity) {
      &a                                            

標簽:
  • Node.js
  • MySQL