Node.js (Express) + MySQL + Redis構建項目流程

以下是使用 Node.js (Express) + MySQL + Redis 構建完整項目的詳細流程,涵蓋環境搭建、架構設計、核心代碼實現和部署優化:


一、項目初始化

1. 創建項目目錄
mkdir my-project
cd my-project
npm init -y
2. 安裝基礎依賴
npm install express mysql2 redis dotenv cors
npm install --save-dev nodemon eslint prettier
3. 目錄結構設計
my-project/
├── config/               # 配置文件
│   ├── db.js            # 數據庫連接
│   └── redis.js         # Redis連接
├── controllers/         # 業務邏輯
│   └── userController.js
├── models/              # 數據模型
│   └── User.js
├── routes/              # 路由定義
│   └── userRoutes.js
├── middlewares/         # 中間件
│   └── authMiddleware.js
├── utils/               # 工具函數
│   └── cache.js
├── app.js               # 應用入口
├── .env                 # 環境變量
└── package.json

二、數據庫配置

1. MySQL 連接配置 (config/db.js)
const mysql = require('mysql2/promise');
const pool = mysql.createPool({host: process.env.MYSQL_HOST,user: process.env.MYSQL_USER,password: process.env.MYSQL_PASSWORD,database: process.env.MYSQL_DATABASE,waitForConnections: true,connectionLimit: 10,queueLimit: 0
});module.exports = pool;
2. Redis 連接配置 (config/redis.js)
const redis = require('redis');
const client = redis.createClient({url: `redis://${process.env.REDIS_HOST}:6379`
});client.on('error', (err) => console.log('Redis Client Error', err));
client.connect();module.exports = client;
3. 環境變量 (.env)
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=yourpassword
MYSQL_DATABASE=myapp
REDIS_HOST=localhost
PORT=3000

三、Express 應用骨架 (app.js)

require('dotenv').config();
const express = require('express');
const cors = require('cors');
const userRoutes = require('./routes/userRoutes');const app = express();// 中間件
app.use(cors());
app.use(express.json());// 路由
app.use('/api/users', userRoutes);// 錯誤處理中間件
app.use((err, req, res, next) => {console.error(err.stack);res.status(500).send('Server Error');
});// 啟動服務器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Server running on port ${PORT}`);
});

四、核心功能實現

1. 數據模型 (models/User.js)
const pool = require('../config/db');class User {static async create({ username, email }) {const [result] = await pool.query('INSERT INTO users (username, email) VALUES (?, ?)',[username, email]);return result.insertId;}static async findById(id) {const [rows] = await pool.query('SELECT * FROM users WHERE id = ?', [id]);return rows[0];}
}module.exports = User;
2. 控制器 (controllers/userController.js)
const User = require('../models/User');
const client = require('../config/redis');const UserController = {async createUser(req, res) {try {const userId = await User.create(req.body);res.status(201).json({ id: userId });} catch (err) {res.status(500).json({ error: err.message });}},async getUser(req, res) {try {const { id } = req.params;const cacheKey = `user:${id}`;// 檢查Redis緩存const cachedUser = await client.get(cacheKey);if (cachedUser) return res.json(JSON.parse(cachedUser));// 數據庫查詢const user = await User.findById(id);if (!user) return res.status(404).send('User not found');// 設置緩存(過期時間60秒)await client.setEx(cacheKey, 60, JSON.stringify(user));res.json(user);} catch (err) {res.status(500).json({ error: err.message });}}
};module.exports = UserController;
3. 路由定義 (routes/userRoutes.js)
const express = require('express');
const router = express.Router();
const UserController = require('../controllers/userController');router.post('/', UserController.createUser);
router.get('/:id', UserController.getUser);module.exports = router;

五、高級功能擴展

1. 緩存工具類 (utils/cache.js)
const client = require('../config/redis');const Cache = {async getOrSet(key, cb, ttl = 60) {const cachedData = await client.get(key);if (cachedData) return JSON.parse(cachedData);const freshData = await cb();await client.setEx(key, ttl, JSON.stringify(freshData));return freshData;}
};module.exports = Cache;
2. 使用示例(改造控制器)
const Cache = require('../utils/cache');async getUser(req, res) {const { id } = req.params;const user = await Cache.getOrSet(`user:${id}`,() => User.findById(id),60 // TTL 60秒);res.json(user);
}

六、數據庫初始化

1. 創建MySQL表
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. Redis 基礎命令驗證
redis-cli
> PING  # 應返回 "PONG"

七、項目運行與調試

1. 開發模式啟動
npx nodemon app.js
2. 測試API
# 創建用戶
curl -X POST http://localhost:3000/api/users \-H "Content-Type: application/json" \-d '{"username":"test","email":"test@example.com"}'# 查詢用戶
curl http://localhost:3000/api/users/1

八、生產環境部署

1. PM2 進程管理
npm install -g pm2
pm2 start app.js --name "my-api"
2. Nginx 反向代理配置
server {listen 80;server_name api.example.com;location / {proxy_pass http://localhost:3000;proxy_set_header Host $host;}
}
3. 安全加固
  • 使用HTTPS(Let’s Encrypt)
  • 數據庫連接限制IP白名單
  • Redis設置密碼認證

九、性能監控(可選)

npm install express-status-monitor

app.js 中添加:

const monitor = require('express-status-monitor');
app.use(monitor());

訪問 /status 查看實時指標


通過以上流程,您已經構建了一個具備以下特性的生產級項目:
? RESTful API 基礎架構
? MySQL 數據持久化
? Redis 緩存加速
? 分層架構設計(Router-Controller-Model)
? 環境變量管理
? 生產環境部署方案

可根據需求進一步擴展:

  • 添加JWT認證
  • 集成Swagger文檔
  • 實現分頁查詢
  • 接入日志系統(Winston/Morgan)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917527.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917527.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917527.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python3 中使用zipfile進行文件(夾)的壓縮、解壓縮

一、文件壓縮與解壓縮模塊 zipfile簡介 zipfile 是 Python 標準庫中用于處理 ZIP 壓縮文件的模塊,提供了創建、讀取、寫入、解壓 ZIP 文件的完整功能。它支持多種壓縮算法,無需安裝額外依賴,是處理 ZIP 格式的首選工具。 核心功能與常用類 zi…

在Java客戶端使用Redis

目錄 第一步:開放Redis外部連接配置 第二步:配置端口轉發 第三步:在IDEA中導入依賴 第四步:編寫代碼命令 連接環境:Java客戶端為本地IDEA,Redis服務器安裝在云服務器Ubuntu系統中。 第一步:開…

【MySQL】MySQL索引—B樹/B+樹

目錄 1. 數據庫索引 1.1 索引的概念 1.2 索引的特點 1.3 索引查詢對比普通的查詢 1.4 索引的操作 1.5 索引的原理 1.6 B樹 1.7 B樹 1.8 B樹的優點 1. 數據庫索引 1.1 索引的概念 數據庫的索引是一種特殊的數據結構,里面包含著數據表中所有記錄的引用&…

jQuery Mobile 面板詳解

jQuery Mobile 面板詳解 引言 隨著移動設備的普及,移動網頁開發變得越來越重要。jQuery Mobile 是一個基于 jQuery 的移動網頁開發框架,它提供了一套豐富的 UI 組件和主題,使得開發者可以快速構建出美觀、響應式的移動網頁。在 jQuery Mobile 中,面板(Panel)是一個非常…

Python中的import和from...import有什么區別?

文章目錄 前言 一、import導入模塊 導入模塊并給它一個別名 語法格式 二、from...import導入特定項 1.導入模塊中的特定項 2.導入模塊中的所有項 2.1 命名空間核污染 2.2 性能影響 總結 前言 在Python編程中,模塊和包的導入機制是編寫可維護、可擴展代碼的核心。深入理解Pyth…

vscode提示“無法使用 compilerPath 解析配置”解決辦法

0 問題描述 使用vscode的Remote-SSH插件連接安裝在虛擬機上的Windows10進行遠程開發時,出現如下提示:無法使用 compilerPath 解析配置:“D:\mingw64\bin\gcc.exe” 所有包含C庫頭文件的文件都被標紅提示錯誤:1 問題原因 vscode沒有設置正確的…

信噪比(Signal-to-Noise Ratio, SNR)詳細介紹

信噪比(Signal-to-Noise Ratio, SNR)信噪比(Signal-to-Noise Ratio,SNR)是衡量信號質量的重要參數,表示有用信號的功率與背景噪聲功率的比值。SNR在通信、音頻處理、視頻處理以及其他電子信號處理領域中具有…

Nginx 相關實驗(1)

nginx源碼編譯 本實驗采用nginx源碼編譯的安裝方式,需要準備一個tar包,可從nginx官網上下載。 下載地址:nginx: downloadhttps://nginx.org/en/download.html 將下載好的壓縮包傳到虛擬機中的自定義目錄下 [rootwebserver ~]# ls anacond…

【選型】HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議(ST 原廠 vs 國產芯片)(單片機選型主要考慮的參數與因素)

國產 vs ST 單片機在工業控制中的性能對比分析 HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議 工業控制領域 MCU 選型:國產航順 HK32 與 ST 原廠芯片深入比較 國產 MCU 是否可替代 ST?基于發電機控制應用的深入評估 從數據手冊看 MCU 制造工藝差異:HK32L088 vs S…

LLM Prompt與開源模型資源(1)提示詞工程介紹

學習材料:https://www.hiascend.com/developer/courses/detail/1935520434893606913學習時長: 預計 30 分鐘學習目的: 了解提示工程的定義與作用 熟悉提示工程的關鍵技術相關概念 掌握基于昇騰適配的大模型提示工程的入門及進階指南 提示…

kafka與其他消息隊列(如 RabbitMQ, ActiveMQ)相比,有什么優缺點?

Kafka、RabbitMQ 和 ActiveMQ 是三種最主流的消息中間件,它們的設計和適用場景有所不同。 我們可以通過一個簡單的表格來快速了解它們的核心區別: 核心對比一覽特性 / 維度KafkaRabbitMQActiveMQ核心模型分布式、持久化的日志系統 (Dumb Broker / Smart …

Kubernetes架構和部署

k8s組件 master節點:管理節點 管理平面組件 api server : api gateway controller manager scheduler etcd 數據庫 worker節點:被管理節點,運行容器 kubelet:k8s agent container runtime:docker,containerd,cri-o kube-proxy:service 網絡 ????????…

建造者模式及優化

建造者模式是一種創建型設計模式,它將復雜對象的構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。核心思想是指揮者定流程,建造者填細節,通過多個步驟逐步構建對象,并允許靈活組合這些步驟以生成不同配置的…

【09】C++實戰篇——C++ 生成靜態庫.lib 及 C++調用lib,及實際項目中的使用技巧

文章目錄1 C 靜態庫.lib 生成1.1 靜態庫lib的生成方法和使用方法1.2 創建靜態庫項目1.3 編寫.h 和 .cpp文件1.4 設置 及 生成 DLL2 調用 C 靜態庫lib2.1 新建LIBtest及測試代碼2.2 靜態庫配置 及代碼調用測試3 實際項目中的使用技巧、及通用設置3.1 設置lib輸出路徑3.2 設置頭文…

飛算JavaAI:從寫不出代碼到絲滑開發,飛算JavaAI把小白從編程深淵撈進了正軌---它都讓我懷疑自己是不是多余的!

開篇介紹 對于很多初學者來說,編程是一項既有趣又充滿挑戰的任務。面對復雜的代碼和繁瑣的開發流程,常常會感到無從下手。不過,現在有了飛算JavaAI,這一切都將變得簡單起來。 它有啥實用功能呢? 比如: …

關于tresos Studio(EB)的MCAL配置之GtmCfg

Generic Time Module通用時鐘模塊GeneralGtmCfg_DevErrorDetect開發者錯誤檢測開關GtmCfg_DemErrorReporting診斷錯誤報告開關GtmCfg_VersionInfoApi獲取版本信息的接口開關GtmCfg_ConfigSetClockManagementUnitGlobal_Clock_Control_Numerator全局時鐘分頻器的分子Global_Cloc…

深入探索Weaviate:構建高效AI應用的數據庫解決方案

在當今數據驅動的世界中,高效地存儲、檢索和處理大規模數據成為了AI應用開發的關鍵挑戰。Weaviate作為一個開源的向量搜索引擎,憑借其強大的功能和靈活的架構,正逐漸成為開發者構建智能AI應用的首選工具。本文將深入探討Weaviate的核心概念、…

【開源】一款開源、跨平臺的.NET WPF 通用權限開發框架 (ABP) ,功能全面、界面美觀

文章目錄一、開源地址二、框架介紹三、技術路線四、適用場景五、功能模塊六、框架演示截圖一、開源地址 Gihub地址: https://github.com/HenJigg/wpf-abp B站學習視頻:https://www.bilibili.com/video/BV1nY411a7T8?spm_id_from333.788.player.switch&…

信創緩存中間件-TongRDS(Redis平替)安裝

TongRDS 是由東方通開發的國產 分布式內存數據緩存中間件,功能類似于 Redis,但它是完全自主研發的國產產品,是國內信創的一大重要組件。它兼容 Redis 的接口,能做到應用代碼無需改動即可替換使用。TongRDS是沒有直接的下載地址的。…

Git鏈接備用手冊

三板斧及其他:git init:初始化git倉庫git add . :將所在文件夾中的所有文件加入到暫存區git commit -m 自定義記錄信息 :將暫存區中的數據放到Git的倉庫(本地)中,并進行記錄(自定義&#xff0…