Node.js中開發(fā)樹形結(jié)構(gòu)接口的實(shí)現(xiàn)
在現(xiàn)代 Web 開發(fā)中,樹形結(jié)構(gòu)的數(shù)據(jù)展示非常常見,例如文件系統(tǒng)、組織架構(gòu)、分類目錄等。本文將介紹如何在 Node.js 中開發(fā)一個(gè)返回樹形結(jié)構(gòu)數(shù)據(jù)的接口。我們將使用 Express 框架來處理 HTTP 請求,并使用 MySQL 數(shù)據(jù)庫來存儲分類數(shù)據(jù)。
項(xiàng)目初始化
首先,確保你已經(jīng)安裝了 Node.js 和 npm。然后,創(chuàng)建一個(gè)新的項(xiàng)目目錄并初始化 npm:
mkdir node-tree-api cd node-tree-api npm init -y
接下來,安裝所需的依賴包:
npm install express mysql2
設(shè)置數(shù)據(jù)庫
為了簡化示例,我們將使用 MySQL 數(shù)據(jù)庫。如果你還沒有安裝 MySQL,可以從 MySQL 官方網(wǎng)站 下載并安裝。
創(chuàng)建一個(gè)新的數(shù)據(jù)庫,例如 tree_api_db:
CREATE DATABASE tree_api_db; USE tree_api_db;
創(chuàng)建分類表
創(chuàng)建一個(gè)名為 categories 的表,包含以下字段:
id: 分類的唯一標(biāo)識
name: 分類的名稱
description: 分類的描述
parent_id: 父分類的 ID,頂級分類的 parent_id 為 NULL 或 0
CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
parent_id INT DEFAULT NULL
);
插入示例數(shù)據(jù)
插入一些示例數(shù)據(jù)以便測試:
INSERT INTO categories (name, description, parent_id) VALUES
('Electronics', 'Electronic products', NULL),
('Computers', 'Computer products', 1),
('Laptops', 'Laptop computers', 2),
('Desktops', 'Desktop computers', 2),
('Mobile Phones', 'Mobile phones', 1),
('Smartphones', 'Smart mobile phones', 5),
('Feature Phones', 'Feature mobile phones', 5),
('Tablets', 'Tablet devices', 1);
編寫樹形結(jié)構(gòu)查詢邏輯
在項(xiàng)目目錄中創(chuàng)建一個(gè) db.js 文件來管理數(shù)據(jù)庫連接:
// db.js
const mysql = require('mysql2');
const connection = mysql.createConnection({
host: 'localhost',
user: 'your_mysql_user',
password: 'your_mysql_password',
database: 'tree_api_db'
});
connection.connect((err) => {
if (err) {
console.error('Error connecting to the database:', err.stack);
return;
}
console.log('Connected to the database.');
});
module.exports = connection;創(chuàng)建一個(gè) utils.js 文件來處理樹形結(jié)構(gòu)的構(gòu)建:
// utils.js
function buildTree(categories) {
const map = {};
const roots = [];
// 將每個(gè)分類放入 map 中
categories.forEach(category => {
map[category.id] = { ...category, children: [] };
});
// 構(gòu)建樹形結(jié)構(gòu)
categories.forEach(category => {
if (category.parent_id === null || category.parent_id === 0) {
roots.push(map[category.id]);
} else {
if (map[category.parent_id]) {
map[category.parent_id].children.push(map[category.id]);
}
}
});
return roots;
}
module.exports = { buildTree };創(chuàng)建 Express 路由
創(chuàng)建一個(gè) app.js 文件來設(shè)置 Express 應(yīng)用并定義路由:
// app.js
const express = require('express');
const db = require('./db');
const { buildTree } = require('./utils');
const app = express();
const port = 3000;
// 中間件,解析 JSON 請求體
app.use(express.json());
// 查詢分類表并以樹形結(jié)構(gòu)返回
app.get('/api/categories', (req, res) => {
const sql = "SELECT id, name, description, parent_id FROM categories";
db.query(sql, (err, results) => {
if (err) {
return res.status(500).send({ code: 0, msg: 'Database error', data: null });
}
// 構(gòu)建樹形結(jié)構(gòu)
const tree = buildTree(results);
// 返回樹形結(jié)構(gòu)的數(shù)據(jù)
res.send({ code: 1, msg: '獲取分類成功', data: tree });
});
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});測試接口
啟動(dòng)你的 Node.js 應(yīng)用:
node app.js
然后,你可以使用工具如 Postman 或?yàn)g覽器訪問 http://localhost:3000/api/categories 來測試新創(chuàng)建的接口。你應(yīng)該會(huì)看到類似以下的 JSON 響應(yīng):
{
"code": 1,
"msg": "獲取分類成功",
"data": [
{
"id": 1,
"name": "Electronics",
"description": "Electronic products",
"parent_id": null,
"children": [
{
"id": 2,
"name": "Computers",
"description": "Computer products",
"parent_id": 1,
"children": [
{
"id": 3,
"name": "Laptops",
"description": "Laptop computers",
"parent_id": 2,
"children": []
},
{
"id": 4,
"name": "Desktops",
"description": "Desktop computers",
"parent_id": 2,
"children": []
}
]
},
{
"id": 5,
"name": "Mobile Phones",
"description": "Mobile phones",
"parent_id": 1,
"children": [
{
"id": 6,
"name": "Smartphones",
"description": "Smart mobile phones",
"parent_id": 5,
"children": []
},
{
"id": 7,
"name": "Feature Phones",
"description": "Feature mobile phones",
"parent_id": 5,
"children": []
}
]
},
{
"id": 8,
"name": "Tablets",
"description": "Tablet devices",
"parent_id": 1,
"children": []
}
]
}
]
}
總結(jié)
到此這篇關(guān)于Node.js中開發(fā)樹形結(jié)構(gòu)接口的文章就介紹到這了,更多相關(guān)Node.js 樹形結(jié)構(gòu)接口內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL如何查找樹形結(jié)構(gòu)中某個(gè)節(jié)點(diǎn)及其子節(jié)點(diǎn)
- MySQL查詢樹形結(jié)構(gòu)數(shù)據(jù)的兩種方法
- MySQL中的常用樹形結(jié)構(gòu)設(shè)計(jì)總結(jié)
- MySql樹形結(jié)構(gòu)(多級菜單)查詢設(shè)計(jì)方案
- Mysql樹形結(jié)構(gòu)的數(shù)據(jù)庫表設(shè)計(jì)方案
- PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例
- sqlserver 樹形結(jié)構(gòu)查詢單表實(shí)例代碼
- SQL處理多級分類,查詢結(jié)果呈樹形結(jié)構(gòu)
相關(guān)文章
nodejs redis 發(fā)布訂閱機(jī)制封裝實(shí)現(xiàn)方法及實(shí)例代碼
這篇文章主要介紹了nodejs redis 發(fā)布訂閱機(jī)制封裝的相關(guān)資料,這里提供了實(shí)現(xiàn)方法,及實(shí)例代碼,具有參考價(jià)值,需要的朋友可以參考下2016-12-12
手把手教你用Node.js爬蟲爬取網(wǎng)站數(shù)據(jù)的方法
這篇文章主要介紹了手把手教你用Node.js爬蟲爬取網(wǎng)站數(shù)據(jù),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng)
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(6):作出響應(yīng),我們接著改造服務(wù)器,讓請求處理程序能夠返回一些有意義的信息,需要的朋友可以參考下2014-12-12
nodejs根據(jù)ip數(shù)組在百度地圖中進(jìn)行定位
本文主要介紹了nodejs根據(jù)ip數(shù)組在百度地圖中進(jìn)行定位的方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03
NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式(三種)
這篇文章主要介紹了NodeJS多種創(chuàng)建WebSocket監(jiān)聽的方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06

