Node的學習以及學習通過Node書寫接口并簡單操作數據庫

Node的學習

  • Node的基礎
  • 上述是關于Node的一些基礎,總結的還行;

利用Node書寫接口并操作數據庫

1. 初始化項目

  • 創建新的項目文件夾,并初始化 package.json
mkdir my-backend
cd my-backend
npm init -y

2. 安裝必要的依賴

  • 安裝Express.js(用于處理http請求)
npm install express
  • 安裝CORS,支持跨域請求
npm install cors
  • 安裝nodemon,使用開發模式(自動重啟服務); s
npm install --save-dev nodemon

3. 創建主程序文件index.js

  • 目前是絕大多數邏輯都寫在了主程序文件index.js中,后續會將里面絕大部分內容抽離開來,比如路由信息、中間件、控制器等;
const db = require('./db'); // 有幾個常用的操作路徑的方式需要注意;// 引入必要模塊
const express = require('express');
const cors = require('cors');const app = express(); // 創建 Express 應用實例
const PORT = 3000; // 設置服務端口// 中間件配置
app.use(cors()); // 允許跨域
app.use(express.json()); // 解析 JSON 格式的請求體
app.use(express.urlencoded({ extended: true })); // 解析 URL 編碼的請求體// 路由
app.get('/', (req, res) => {res.send('Hello, World! Welcome to the Node.js backend!');
});app.post('/data', (req, res) => {const { name, age } = req.body; // 從請求體中獲取數據res.json({ message: `Received data for ${name}, age ${age}` });
});/***  擴展功能:1. 增加更多路由;或者說查詢路由*/
app.get('/users', (req, res) => {db.query('SELECT * FROM users', (err, results) => {if (err) {res.status(500).json({ error: 'Database query failed' });return;}res.json(results);});
});// 2. 插入用戶數據
app.post('/addUser', (req, res) => {// const { id, username, password } = req.body;db.query('INSERT INTO users (id, username, password) VALUES (?, ?, ?)', [id, username, password], (err, result) => {if (err) {res.status(500).json({ error: 'Failed to insert user' });return;}res.json({ message: 'User created successfully', userId: result.insertId });});
})// post請求一般都會解析用戶數據;
app.post('/users', (req, res) => {const { name } = req.body;res.json({ message: `User ${name} created successfully!` });
});// 啟動服務
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});

4. 主程序中連接數據庫操作

  • 安裝數據庫
npm install mongoose    # MongoDB
npm install mysql2      # MySQL
  • 連接數據庫 db.js
const mysql = require('mysql2');// 創建數據庫連接
const db = mysql.createConnection({host: 'localhost',user: 'root',password: '123456',database: 'my_db_01'
});// 連接數據庫
db.connect((err) => {if (err) {console.error('Error connecting to the database:', err);return;}console.log('Connected to MySQL database.');
});module.exports = db; // 導出數據庫連接實例

5. 運行服務器

npx nodemon index.js
  • 結果圖
    表示成功連接上數據庫

6. 測試

get接口方法測試
  • 在瀏覽器測試; 輸入:http://localhost:3000/users
    在這里插入圖片描述
  • postman測試
    postman測試結果圖
post接口方法測試

在這里插入圖片描述

  • 在發送請求以后,即可在數據庫中查看到新添加的數據新添加的數據

Node項目的規范化

  • 上面的Node項目已經可以完成一個較為試水的項目了,但是項目結構需要優化下:
    Node項目規范化結構

路由模塊寫法

  • 將原先寫在app.js(index.js)中的路由信息分開寫,分為users.js和students.js
  • 以users.js為例,其路由信息的js書寫如下:
// 用戶路由
const express = require('express'); 
const router = express.Router(); 
const db = require('../db');  // 引入數據庫配置信息// 獲取所有用戶數據
router.get('/users', (req, res) => {db.query('SELECT * FROM users', (err, results) => {if (err) {res.status(500).json({ error: 'Database query failed' });return;}res.json(results);});});// 添加用戶信息
router.post('/addUser', (req, res) => {const { id, username, password } = req.body;db.query('INSERT INTO users (id, username, password) VALUES (?, ?, ?)', [id, username, password], (err, result) => {if (err) {res.status(500).json({ error: 'Failed to insert user' });return;}res.json({ message: 'User created successfully', userId: result.insertId });});})module.exports = router; 
  • 添加到app.js的路由書寫如下:
// app.js 作為入口文件;const express = require('express');
const cors = require('cors');
const userRoutes = require('./routes/users'); // 引入用戶路由
const studentsRoutes = require('./routes/students'); // 引入學生路由const app = express(); 
const PORT = 3000; // 中間件配置
app.use(cors()); // 允許跨域
app.use(express.json()); // 處理JSON格式
app.use(express.urlencoded({ extended: true })); // 處理URL編碼// 基礎路由
app.get('/', (req, res) => {res.send('Hello, World! Welcome to the Node.js backend!');
});// 使用路由模塊
app.use('/api', userRoutes); // 將用戶相關路由掛載到/api中;
app.use('/api', studentsRoutes); // 啟動服務
app.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});
  • 問題:為什么使用路由模塊需要將用戶相關路由掛載到 /apo中,而不是直接/ 呢
    • RESTful風格標準(現代web開發的一種標準)
    • 防止命名沖突,如果項目中沒有統一前綴,路由很容易與其他資源沖突
    • 前端調用時的統一管理,有利于集中管理API

控制器寫法

  • 其實控制器就是在路由的基礎上進一步優化,這一點非常關鍵;
  • 具體見操作數據庫的代碼

路徑參數和查詢參數的比較

  • 路徑參數查詢參數 是兩種不同的傳參方式,需要在路由定義和請求中保持一致。

路徑參數

  • 路徑參數:通過id查詢
router.get('/getStudentsById/:id', getStudentById);
  • Postman 請求示例
GET http://localhost:3000/api/getStudentsById/101
const getStudentById = (req, res) => {console.log('req.params', req.params); const { id } = req.params; // 從路徑參數中獲取 idconsole.log('我已經獲取到了id是', id);db.query('SELECT * FROM student WHERE id = ?', [id], (err, results) => {if (err) {res.status(500).json({ error: 'Database query failed' });return;}if (results.length === 0) {return res.status(404).json({ message: 'Student not found' });}res.json(results[0]);});
};

查詢參數

  • 如果想通過 ?id=101 這樣的查詢參數傳值,那么需要修改控制器中的代碼,從 req.query 中獲取參數。
  • 路由定義:
router.get('/getStudentsById', getStudentById); // 無需路徑參數
  • Postman 請求示例:
GET http://localhost:3000/api/getStudentsById?id=101
  • 控制器代碼修改:
const getStudentById = (req, res) => {console.log('req.query', req.query); const { id } = req.query; // 從查詢參數中獲取 idconsole.log('我已經獲取到了id是', id);if (!id) {return res.status(400).json({ error: 'Student ID is required' });}db.query('SELECT * FROM student WHERE id = ?', [id], (err, results) => {if (err) {res.status(500).json({ error: 'Database query failed' });return;}if (results.length === 0) {return res.status(404).json({ message: 'Student not found' });}res.json(results[0]);});
};

兩種方式的總結

  1. 路徑參數(推薦):

    • URL 格式:/getStudentsById/:id
    • 請求示例:GET /api/getStudentsById/101
    • 后端通過 req.params 獲取參數。
  2. 查詢參數

    • URL 格式:/getStudentsById?id=101
    • 請求示例:GET /api/getStudentsById?id=101
    • 后端通過 req.query 獲取參數

總結:使用 路徑參數 更符合 RESTful 風格,代碼更語義化。

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

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

相關文章

計算機視覺中的特征提取算法

摘要: 本文聚焦于計算機視覺中的特征提取算法,深入探討尺度不變特征變換(SIFT)算法。詳細闡述 SIFT 算法的原理,包括尺度空間構建、關鍵點檢測、方向分配與特征描述子生成等核心步驟。通過 C#、Python 和 C 三種編程語…

MySQL 主從復制與 Binlog 深度解析

目錄 1. Binlog的工作原理與配置2. 主從復制的設置與故障排除3. 數據一致性與同步延遲的處理 小結 MySQL的binlog(二進制日志)和主從復制是實現數據備份、容災、負載均衡以及數據同步的重要機制。在高可用性架構和分布式數據庫設計中,binlog同…

排隊論、負載均衡和任務調度關系

目錄 排隊論、負載均衡和任務調度關系 一、排隊論 二、負載均衡 三、任務調度 四、總結 排隊論、負載均衡和任務調度關系 排隊論為負載均衡和任務調度提供了數學理論和方法支持 排隊論、負載均衡和任務調度是三個相關但不同的概念。以下是對這三個概念的詳細解釋和它們之…

java版詢價采購系統 招投標詢價競標投標系統 招投標公告系統源碼

功能描述 1、門戶管理:所有用戶可在門戶頁面查看所有的公告信息及相關的通知信息。主要板塊包含:招標公告、非招標公告、系統通知、政策法規。 2、立項管理:企業用戶可對需要采購的項目進行立項申請,并提交審批,查看所…

景聯文科技入選中國信通院發布的“人工智能數據標注產業圖譜”

近日,由中國信息通信研究院、中國人工智能產業發展聯盟牽頭,聯合中國電信集團、沈陽市數據局、保定高新區等70多家單位編制完成并發布《人工智能數據標注產業圖譜》。景聯文科技作為人工智能產業關鍵環節的代表企業,入選圖譜中技術服務板塊。…

【小沐學GIS】基于C++繪制三維數字地球Earth(OpenGL、glfw、glut、QT)第三期

🍺三維數字地球系列相關文章如下🍺:1【小沐學GIS】基于C繪制三維數字地球Earth(456:OpenGL、glfw、glut)第一期2【小沐學GIS】基于C繪制三維數字地球Earth(456:OpenGL、glfw、glut)第二期3【小沐…

實景視頻與模型疊加融合?

[視頻GIS系列]無人機視頻與與實景模型進行實時融合_無人機視頻融合-CSDN博客文章瀏覽閱讀1.5k次,點贊28次,收藏14次。將無人機視頻與實景模型進行實時融合是一個涉及多個技術領域的復雜過程,主要包括無人機視頻采集、實景模型構建、視頻與模型…

MySQL通過binlog日志進行數據恢復

記錄一次阿里云MySQL通過binlog日志進行數據回滾 問題描述由于阿里云遠程mysql沒有做安全策略 所以服務器被別人遠程攻擊把數據庫給刪除,通過查看binlog日志可以看到進行了drop操作,下面將演示通過binlog日志進行數據回滾操作。 1、查詢是否開始binlog …

IDEA 修改格式化僅格式化本次改動代碼

最近總是發現格式化的時候會格式化文件所有代碼,提交Git 后再看提交日志,就很不清晰。修改方式如下 中文: 格式化代碼快捷鍵[中文配置]: 英文: 格式化代碼快捷鍵[英文配置]:

el-table ToggleRowSelection實現取消選中沒效果(virtual-scroll)

場景: 就是在虛擬列表el-table選中之后 點擊查詢 默認之前選中的 現象: 就是實現選中, 但是無法去除勾選等等 問題發現: 看定位的數據 有多個一樣的,我想著勾選之前 先去掉勾選 ,但是沒效果或者說“相同的…

【含開題報告+文檔+PPT+源碼】基于微信小程序的點餐系統的設計與實現

開題報告 隨著互聯網技術的日益成熟和消費者生活水平與需求層次的顯著提升,外賣點餐平臺在中國市場上迅速興起并深深植根于民眾日常生活的各個角落。這類平臺的核心在于構建了一個基于互聯網的強大訂餐服務系統,它無縫整合了餐飲商戶資源與廣大消費者的…

解決 MyBatis 中空字符串與數字比較引發的條件判斷錯誤

問題復現 假設你在 MyBatis 的 XML 配置中使用了如下代碼&#xff1a; <if test"isCollect ! null"><choose><when test"isCollect 1">AND exists(select 1 from file_table imgfile2 where task.IMAGE_SEQimgfile2.IMAGE_SEQ and im…

SpringBoot 手動實現動態切換數據源 DynamicSource (中)

大家好&#xff0c;我是此林。 SpringBoot 手動實現動態切換數據源 DynamicSource &#xff08;上&#xff09;-CSDN博客 在上一篇博客中&#xff0c;我帶大家手動實現了一個簡易版的數據源切換實現&#xff0c;方便大家理解數據源切換的原理。今天我們來介紹一個開源的數據源…

ASCII碼簡介以及在php中的使用

什么是 ASCII&#xff1f; ASCII&#xff08;American Standard Code for Information Interchange&#xff0c;美國信息交換標準代碼&#xff09;是一種字符編碼標準&#xff0c;用于在計算機、通信設備及其他設備中表示文字、符號和控制信息。它最早于 1963 年由美國國家標準…

前端學習一

一 進程與線程 線程是進程執行的最小單位&#xff0c;進程是系統分配任務的最小單位。 一個進程可執行最少一個線程。線程分為子線程和主線程。 主線程關閉則子線程關閉。 二 瀏覽器進程 瀏覽器是多進程多線程應用。 進程包括&#xff1a; 瀏覽器進程 負責程序交互渲染…

Go vendor

博主在編寫Go代碼時&#xff0c;遇到了這樣一個問題&#xff1a;想要修改某個外部包&#xff0c;添加幾個函數&#xff0c;而其余功能繼續使用&#xff0c;經過調研&#xff0c;發現可以將Go的外部包源碼復制到項目本地&#xff0c;對包的代碼進行修改&#xff0c;從而達到目的…

EasyExcel 動態設置表格的背景顏色和排列

項目中使用EasyExcel把數據以excel格式導出&#xff0c;其中設置某一行、某一列單元格的背景顏色、排列方式十分常用&#xff0c;記錄下來方便以后查閱。 1. 導入maven依賴&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easy…

概率論得學習和整理23:EXCEL 數據透視表基礎操作

目錄 1 選擇數據&#xff0c;插入數據透視表 2 選擇數據透視表生成位置 3 出現了數據透視表的面板 4 數據透視表的基本結構認識 4.1 交叉表/列聯表 4.2 row, column, cell 一個新增的篩選器&#xff0c;就這么簡單 4.3 可以只添加 rowcell/值 &#xff0c;也可以colu…

計算機網絡從誕生之初到至今的發展歷程

前言 "上網"&#xff0c;相信大家對這個動詞已經不再陌生&#xff0c;網 通常指的是網絡&#xff1b;在 2024 年的今天&#xff0c;網絡已經滲透到了每個人的生活中&#xff0c;成為其不可或缺的一部分&#xff1b;你此時此刻在看到我的博客&#xff0c;就是通過網絡…

C# 讀取EXCEL的數據批量插入單個PDF里的多個位置

C# 讀取EXCEL的數據批量插入單個PDF里的多個位置 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; usin…