NodeJS全棧開發面試題講解——P3數據庫(MySQL / MongoDB / Redis)

3.1 如何用 Node.js 連接 MySQL?你用過哪些 ORM?

面試官您好,我先介紹如何用 Node.js 連接 MySQL,然后補充我常用的 ORM 工具。


🔌 原生連接 MySQL

使用 mysql2 模塊:

npm install mysql2

const mysql = require('mysql2/promise');const pool = mysql.createPool({host: 'localhost',user: 'root',database: 'test',password: '123456',waitForConnections: true,connectionLimit: 10,
});async function queryUsers() {const [rows] = await pool.query('SELECT * FROM users');console.log(rows);
}

🛠 我用過的 ORM:

ORM 工具適用范圍特點
SequelizeMySQL/PostgreSQL/SQLite常用于 Node.js 項目,支持關系定義、事務等
TypeORMNestJS(+ TypeScript)裝飾器風格,強類型支持好,適合 Nest 項目
PrismaModern ORM自動生成 TS 類型,支持代碼提示,開發效率高


? 3.2 Sequelize(或 TypeORM)如何實現一對多、多對多關系?

ORM 的關系映射是重點,我以 Sequelize 為例說明一對多、多對多怎么建模。


🔗 一對多(One-To-Many)

場景:一個用戶有多個文章

User.hasMany(Post);   // 在 Post 中生成 userId 外鍵
Post.belongsTo(User); // 反向關系

查詢:

User.findAll({ include: Post });


🔗 多對多(Many-To-Many)

場景:文章可以有多個標簽,標簽可以屬于多個文章

Post.belongsToMany(Tag, { through: 'PostTags' });
Tag.belongsToMany(Post, { through: 'PostTags' });

ORM 自動生成中間表 PostTags,并能聯表查詢。


🧩 TypeORM 實現方式:

@Entity()
export class User {@OneToMany(() => Post, post => post.user)posts: Post[];
}@Entity()
export class Post {@ManyToOne(() => User, user => user.posts)user: User;
}

多對多:

@ManyToMany(() => Tag, tag => tag.posts)
@JoinTable()
tags: Tag[];

? 3.3 Redis 在全棧項目中常見用途有哪些?舉例說明

Redis 是非常常見的中間件,我用它處理過緩存、限流、隊列、會話等功能,下面我舉幾個常用場景:


📌 常見用途和示例:

用途示例
? 數據緩存用戶信息、商品列表、排行榜緩存
? Session 管理登錄狀態存 Redis,支持多服務共享
? 分布式鎖防止秒殺系統超賣、搶單并發
? 消息隊列使用 Redis List 實現異步下單
? 訪問限流IP 限流、接口防刷


示例:接口緩存

const key = `user:${userId}`;
const cached = await redis.get(key);if (cached) return JSON.parse(cached);const user = await db.query('SELECT * FROM users WHERE id = ?', [userId]);
await redis.setEx(key, 60, JSON.stringify(user)); // 緩存 1 分鐘

? 3.4 如何實現緩存更新策略(如 Cache-Aside)?

面試官,我用過多種緩存策略,最常用的是 Cache-Aside,也叫旁路緩存。


🧠 Cache-Aside 模式:

  1. 讀請求先查緩存,沒有再查數據庫,然后寫入緩存;

  2. 寫請求時,更新數據庫,然后刪除或更新緩存

// 讀取
async function getUser(id) {const key = `user:${id}`;const cache = await redis.get(key);if (cache) return JSON.parse(cache);const user = await db.query('...');await redis.setEx(key, 300, JSON.stringify(user));return user;
}// 更新
async function updateUser(id, data) {await db.update('users', data);await redis.del(`user:${id}`); // 延遲寫
}

? 其他策略(了解加分):

策略特點
Write-Through每次寫數據庫也寫緩存
Write-Behind寫操作先寫緩存,后臺再更新數據庫
Cache-Aside應用控制緩存的讀取和失效(最靈活)


? 3.5 如何處理事務?MySQL 事務是如何保證一致性的?

事務是后端開發的重中之重,關系到數據一致性。我以 Sequelize 和原生方式分別說明,并簡要介紹事務四大特性。


🔁 Sequelize 中事務處理:

const t = await sequelize.transaction();try {await User.update(..., { transaction: t });await Order.create(..., { transaction: t });await t.commit();
} catch (err) {await t.rollback();
}

? 原生 MySQL 示例(mysql2):

const conn = await pool.getConnection();
try {await conn.beginTransaction();await conn.query('UPDATE account SET balance = balance - 100 WHERE id=1');await conn.query('UPDATE account SET balance = balance + 100 WHERE id=2');await conn.commit();
} catch (err) {await conn.rollback();
}

? MySQL 的事務一致性靠什么保證?

ACID 四大特性:

特性含義
A 原子性要么全部成功,要么全部失敗
C 一致性執行完事務后,數據從一個一致狀態到另一個狀態
I 隔離性多事務并發不互相干擾(通過隔離級別控制)
D 持久性提交后永久生效,斷電也不丟失(靠 redo log)


🚧 MySQL 是如何實現事務的?

  • 使用 InnoDB 引擎

  • 依賴于 redo log(重做日志)undo log(回滾日志)

  • 控制隔離性通過設置 REPEATABLE READ, READ COMMITTED 等隔離級別。


? 總結:

問題編號技術點
3.1Node 連接 MySQL,使用 ORM(Sequelize / TypeORM)
3.2一對多、多對多關系映射與查詢
3.3Redis 多場景應用:緩存、限流、隊列等
3.4Cache-Aside 緩存策略的實現與代碼演示
3.5事務操作方式 + MySQL ACID 原理


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

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

相關文章

Redis最佳實踐——性能優化技巧之數據結構選擇

Redis在電商應用中的數據結構選擇與性能優化技巧 一、電商核心場景與數據結構選型矩陣 應用場景推薦數據結構內存占用讀寫復雜度典型操作商品詳情緩存Hash低O(1)HGETALL, HMSET購物車管理Hash中O(1)HINCRBY, HDEL用戶會話管理Hash低O(1)HSETEX, HGET商品分類目錄Sorted Set高O…

題單:最大公約數(輾轉相除法)

題目描述 所謂 “最大公約數(GCD)” ,是指所有公約數中最大的那個,例如 12 和 1818 的公約數有 1,2,3,6 ,所以 12 和 18 的最大公約數為 6 。 輾轉相除法,又名歐幾里德算法(Euclidean Algorit…

hadoop完整安裝教程(附帶jdk1.8+vim+ssh安裝)

本篇帶領大家在uabntu20虛擬機上安裝hadoop,其中還包括jdk1.8、ssh、vim的安裝教程,(可能是)史上最全的安裝教程!!!若有疑問可以在評論區或者私信作者。建議在虛擬機上觀看此博客,便…

Flutter、React Native、Unity 下的 iOS 性能與調試實踐:兼容性挑戰與應對策略(含 KeyMob 工具經驗)

移動端跨平臺開發逐漸成為常態,Flutter、React Native、Unity、Hybrid App 等框架在各類 iOS 項目中頻繁出現。但隨之而來的,是一系列在 iOS 設備上調試難、性能數據采集難、日志整合難的問題。 今天這篇文章,我從實際項目出發,聊…

PyCharm接入DeepSeek,實現高效AI編程

介紹本土AI工具DeepSeek如何結合PyCharm同樣實現該功能。 一 DeepSeek API申請 首先進入DeepSeek官網:DeepSeek 官網 接著點擊右上角的 “API 開放平臺“ 然后點擊API keys 創建好的API key,記得復制保存好 二 pycharm 接入deepseek 首先打開PyCh…

Cinnamon開始菜單(1):獲取應用數據

看了半天:/usr/share/cinnamon/applets/menucinnamon.org,終于挖到了精髓。 Cinnamon.AppSystem.get_default() 獲取系統應用數據 get_tree() 獲取樹機構 get_root_directory() 獲取根目錄 iter() 遍歷 get_name() 獲取名稱 get_desktop_file_id()…

git reset --hard HEAD~1與git reset --hard origin/xxx

git reset --hard HEAD~1與git reset --hard origin/xxx git reset --hard origin/xxx有時候會太長,手工輸入略微繁瑣,可以考慮: git reset --hard HEAD~1 替代。 或者使用這種方式 git reset撤銷當前分支所有修改,恢復到最近一…

鴻蒙OSUniApp PWA開發實踐:打造跨平臺漸進式應用#三方框架 #Uniapp

UniApp PWA開發實踐:打造跨平臺漸進式應用 前言 在過去的一年里,我們團隊一直在探索如何利用UniApp框架開發高性能的PWA應用。特別是隨著鴻蒙系統的普及,我們積累了不少有價值的實踐經驗。本文將分享我們在開發過程中的技術選型、架構設計和…

ansible自動化playbook簡單實踐

方法一:部分使用ansible 基于現有的nginx配置文件,定制部署nginx軟件,將我們的知識進行整合 定制要求: 啟動用戶:nginx-test,uid是82,系統用戶,不能登錄 啟動端口82 web項目根目錄/…

【Office】Excel兩列數據比較方法總結

在Excel中,比較兩列數據是否相等有多種方法,以下是常用的幾種方式: 方法1:使用公式(返回TRUE/FALSE) 在空白列(如C列)輸入公式,向下填充即可逐行比較兩列(如…

day 42

知識點回顧 1.回調函數 2.lambda函數 3.hook函數的模塊鉤子和張量鉤子 4.Grad-CAM的示例 一。回調函數示例 Hook本質是回調函數,所以我們先介紹一下回調函數。回調函數是作為參數傳遞給其他函數的函數,其目的是在某個特定事件發生時被調用執行。這…

10.安卓逆向2-frida hook技術-frida基本使用-frida指令(用于hook)

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動! 內容參考于:圖靈Python學院 工具下載: 鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取碼&#xff1…

LLM-MPC混合架構:車載大語言模型用來增強自動駕駛系統

1. 概述 2025年,蘇黎世研究團隊在RSS2025會議上正式提出「LLM-MPC混合架構」,標志著大語言模型(LLM)在自動駕駛系統中的實用化邁出關鍵一步。該方案旨在解決傳統深度學習模型在極端交通場景中泛化能力不足的問題。通過在車載終端…

解釋k8s種ConfigMap和Secret的作用,如何在Pod中掛載環境變

一、ConfigMap & Secret 核心定位 屬于Kubernetes的配置管理特性,用于解耦應用與配置 1. ConfigMap 作用:存儲非敏感配置數據 存儲內容: 環境變量命令行參數配置文件(如JSON/XML/YAML)系統參數(如J…

Android --- ObjectAnimator 和 TranslateAnimation有什么區別

文章目錄 2. 作用范圍和功能2. 動畫表現3. 是否修改 View 的屬性4. 適用場景5. 性能總結: ObjectAnimator 和 TranslateAnimation 都是 Android 中常用的動畫類型,但它們有以下幾個關鍵的區別: 2. 作用范圍和功能 ObjectAnimator&#xff1a…

3d GIS數據來源與編輯工具

1、衛星遙感 2、航空攝影測量 3、地面實測技術 全站儀 3維掃描 3D GIS數據制作全流程詳解 一、數據采集:多源數據獲取 3D GIS數據的制作需從多維度采集地理空間信息,以下是主要采集方式及適用場景: (一)遙感與航測…

實驗設計與分析(第6版,Montgomery)第4章隨機化區組,拉丁方, 及有關設計4.5節思考題4.26~4.27 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第章隨機化區組&#xff0c;拉丁方&#xff0c; 及有關設計4.5節思考題4.26~4.27 R語言解題。主要涉及方差分析&#xff0c;正交拉丁方。 batch <- c(rep("batch1",5), rep(…

linux創建虛擬網卡和配置多ip

1.展示當前網卡信息列表&#xff1a; linux上&#xff1a; ip a ifconfigwindows上&#xff1a; ipconfig 2.創建虛擬網卡對&#xff1a; sudo ip link add name veth0 type veth peer name veth1 在 ip link add 命令中&#xff0c;type 參數可以指定多種虛擬網絡設備類型&…

分布式項目保證消息冪等性的常見策略

Hello&#xff0c;大家好&#xff0c;我是灰小猿&#xff01; 在分布式系統中&#xff0c;由于各個服務之間獨立部署&#xff0c;各個服務之間依靠遠程調用完成通信&#xff0c;再加上面對用戶重復點擊時的重復請求等情況&#xff0c;所以如何保證消息消費的冪等性是在分布式或…

微信小程序(uniapp)對接騰訊云IM

UniApp 對接騰訊云 IM&#xff08;即時通訊&#xff09;完整指南 一、項目背景與需求分析 隨著社交場景的普及&#xff0c;即時通訊功能已成為移動應用的標配。騰訊云 IM&#xff08;Tencent IM&#xff0c;即 TIM&#xff09;提供穩定可靠的即時通訊服務&#xff0c;支持單聊…