使用 Node、Express 和 MongoDB 構建一個項目工程

本文將詳細介紹如何使用?Node.js + Express + MongoDB?構建一個完整的 RESTful API 后端項目,涵蓋:

  • 項目初始化

  • Express 服務器搭建

  • MongoDB 數據庫連接

  • REST API 設計(CRUD 操作)

  • 錯誤處理與中間件

  • 源碼結構與完整代碼

  • 部署建議

一,Express 服務器搭建

1. 環境準備

1.1 安裝必要工具

  • Node.js(建議 LTS 版本)

  • MongoDB(本地或 Atlas 云數據庫)

  • 代碼編輯器(如 VS Code)

  • Postman(API 測試)

1.2 初始化項目

mkdir node-express-mongodb-backend
cd node-express-mongodb-backend
npm init -y

2. 創建項目

express node-express-mongodb-backend

  • express:Web 框架

  • mongoose:MongoDB 對象建模

  • body-parser:解析請求體

  • cors:跨域支持

  • dotenv:環境變量管理

  • nodemon:開發熱重載

3.更新項目依賴

npm install

{

? "name": "node-express-mongodb-backend",

? "version": "0.0.0",

? "private": true,

? "scripts": {

? ? "start": "node ./bin/www"

? },

? "dependencies": {

? ? "cookie-parser": "~1.4.4",

? ? "debug": "~2.6.9",

? ? "express": "~4.16.1",

? ? "http-errors": "~1.6.3",

? ? "jade": "~1.11.0",

? ? "morgan": "~1.9.1"

? }

}

4. 項目結構

NODE-EXPRESS-MONGODB-BACKEND/
├── bin/? ? ? ? ? ? ? ? ? ? ? ? ? ? # 啟動腳本
├── node_modules/ ? ? ? ? # 依賴庫(npm install 生成)
├── public/? ? ? ? ? ? ? ? ? ? ? ?# 靜態資源(CSS/JS/圖片)
├── routes/? ? ? ? ? ? ? ? ? ? ? # 路由定義
├── views/? ? ? ? ? ? ? ? ? ? ? ?# 前端模板(Jade/Pug)
├── app.js? ? ? ? ? ? ? ? ? ? ? ? # 主應用入口文件
├── package.json? ? ? ? ? ? # 項目配置和依賴
└── package-lock.json ? ? # 依賴版本鎖定

5. 配置項目啟動信息

// app.listen(端口號,服務器啟動成功時調用的函數);
app.listen(3001,function(){console.log('服務器啟動成功,端口號為3001');
});

刪除app.js最后一行代碼,替換成上述代碼。端口占用可以修改端口號!

6.啟動項目

node app.js

啟動完成在終端會輸出:服務器啟動成功!端口號為3001

7.下載nodemon插件

目的是:為了讓以后代碼修改后,服務器自動啟動。我們需要下載nodemon插件!

npm i nodemon -g

8.? 啟動項目

nodemon app.js

注意要是端口占用,直接手動修改端口號,直到命令行輸出成功啟動!

[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
后端服務器啟動,端口3001
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
后端服務器啟動,端口3011

9.app .js代碼的注釋 (方便理解代碼!)

/*** (1)引入項目中需要的模塊*/
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
// 處理項目中日志,第三方寫好插件
var logger = require('morgan');var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');//通過express創建一個對象。項目對象
var app = express();// 后端配置頁面,我們目前不需要
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');/*** 加載項目運行插件*/
//配置日志環境
app.use(logger('dev'));
//前端發送json數據,后端可以接受
app.use(express.json());
//后端來處理請求地址。
app.use(express.urlencoded({ extended: false }));
//處理請求傳遞cookie信息
app.use(cookieParser());
//指定項目中public為靜態資源 ,這個文件夾里面資源前端直接訪問
app.use(express.static(path.join(__dirname, 'public')));//配置路由
app.use('/', indexRouter);
app.use('/users', usersRouter);// 配置404的訪問結果
app.use(function(req, res, next) {next(createError(404));
});// 后端報錯,錯誤信息在這里處理
app.use(function(err, req, res, next) {
// set locals, only providing error in developmentres.locals.message = err.message;res.locals.error = req.app.get('env') === 'development' ? err : {};// render the error pageres.status(err.status || 500);res.render('error');
});// module.exports = app;
// 啟動服務器,監聽3001端口
app.listen(3011,()=>{console.log("后端服務器啟動,端口3011");
})

二,MongoDB 數據庫下載及連接

MongoDB是一個分布式文件存儲的非關系型數據庫,適用于高并發讀寫、海量數據存儲和高可擴展性的場景。本文詳細介紹了MongoDB的安裝、啟動、連接方法,包括Windows和Linux環境,以及常用命令、數據類型、特點、復制集、備份還原等。同時,講解了MongoDB的可視化工具Compass的使用,以及如何通過mongoose在Node.js中進行數據操作。

1.下載安裝MongoDB

MongoDB官網:Download MongoDB Community Server | MongoDB

最后安裝時將這個勾選去掉!!!

2.下載安裝安裝圖形化界面軟件Navicat

下載地址:https://dn.navicat.com.cn/download/navicat17_premium_lite_cs_x64.exe

3.Nodejs獲取mongodb數據庫的數據

(1)安裝mongoose插件

npm i mongoose

(2)在項目種創建utils文件夾,里面創建db.js文件

const mongoose = require("mongoose");const connectDB = async () => {try {await mongoose.connect("mongodb://127.0.0.1:27017/unmannedAerialVehiclePipelineInspection");console.log("MongoDB連接成功");} catch (error) {console.log("連接數據庫失敗:", error);process.exit(1); // 退出進程}
};connectDB();

(3)找到app.js文件,引入db.js

// 處理項目中日志,第三方寫好插件
var logger = require('morgan');//路由請求之前,連接數據庫
require("./utils/db")

(4) 啟動MongoDB連接

提供一些方式:

首先在環境變量-用戶變量中,新增 path? --->? D:\MongoDB\bin

方法一:配置文件方式啟動服務
  1. 在MongoDB安裝路徑下,在bin同級新建conf文件夾;
  2. 在該文件中,用文件文檔建立?mongod.conf文件
storage:#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.dbPath: D:\MongoDB\data\db

dbPath的路徑根據自己的路徑來寫!

方法二: Window 下安裝 Mongodb 并設置為開機自啟
  1. 在MongoDB文件下新建data 然后新建db? ? 順序是這樣:D:\MongoDB\data\db
  2. MongoDB下新建文件夾?log(存放日志文件),并且在里面新建文件?mongodb.log
  3. 在MongoDB文件建立mongod.conf文本文檔,內容如下:

systemLog:
? ? destination: file
? ? path: D:\MongoDB\log\mongod.log
? ? logAppend: true
storage:
? ? dbPath: D:\MongoDB\data\db
net:
? ? bindIp: 127.0.0.1
? ? port: 27017

? ? ? 4.在D:\MongoDB\bin 路徑下,啟動cmd命令框,輸入命令!

sc.exe create MongoDB binPath=D:\MongoDB\bin\mongod.exe\" --service --config=\"D:\MongoDB\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"

? ? ? 5. 啟動完成后在任務管理器中可以看得

啟動不成功!請參考以下文章!【親身實踐已解決】Windows無法啟動MongoDB Server,錯誤:1053:服務沒有及時響應啟動或控制請求_錯誤1053 服務沒有及時響應啟動或控制請求-CSDN博客

三,后端MVC架構

項目根目錄下文件

? ? ? ? routes文件夾--->users.js

? ? ? ??controllers文件夾--->UserController.js

? ? ? ? models文件夾--->UserModel_DB.js

四,Node后端身份驗證

1.搭建身份認證環境? ?

(1)需要下載依賴引入jwt ;解決:生成token憑證

npm i jsonwebtoken express-jwt

#?express-jwt這個中間件,目的就算為了驗證token

(2)生成token

(3)UserController里面加入代碼

const UserModel_DB = require("../models/UserModel_DB");
const Response = require("../utils/Response");
const Jwt = require("jsonwebtoken");
const { getEncAes128 } = require("../utils/crypto");class usercontroller {/*** 所有用戶*/async alluser(req, res, next) {try {const data = await UserModel_DB.find();res.send(Response.success({ msg: "全部用戶", data }));} catch (error) {console.log(error);res.send(Response.error({ msg: "數據傳輸失敗" }));}}/*** 登錄*/async login(req, res, next) {try {const { username, password } = req.body;// 傳遞了一個對象,按照傳遞對象去數據篩選// 將password進行同樣加密,將結果放在數據庫中尋找const newPassword = getMD5(password);const data = await UserModel_DB.find({username: username,password: newPassword,});console.log(data);if (data.length) {//生成身份憑證//第一個參數生成保存用戶自己信息,//第二個參數screct密鑰//設置過期時間,以s作為單位const token = jwt.sign({ username }, "shuangxiangbabai", {expiresIn: 60 * 60,});res.send(Response.success({ data: "Bearer " + token }));} else {res.send(Response.error());}} catch (error) {console.log(error);res.send(Response.error({ msg: "服務器報錯" }));}}/*** 注冊*/async register(req, res, next) {const { username, password, age, phone, avatar, gender } = req.body;if (username && password && age && phone && avatar && gender) {const result = getEncAes128(password);const data = await UserModel_DB.create({username,password: result,age,phone,avatar,gender,});if (data) {res.send(Response.success({ msg: "注冊成功", data }));} else {res.send(Response.error({ msg: "注冊失敗" }));}} else {res.send(Response.error({ msg: "數據傳輸失敗" }));}}/*** 修改密碼*/async fixpsd(req, res, next) {try {const { id, newpassword } = req.body;const result = getEncAes128(newpassword);const data = await UserModel_DB.updateOne({ _id: id },{ password: result });if (data.acknowledged) {res.send(Response.success({ msg: "修改成功", data }));} else {res.send(Response.error({ msg: "修改失敗" }));}} catch (error) {console.log(error);res.send(Response.error({ msg: "數據傳輸失敗" }));}}/*** 根據token驗證用戶*/async UserInfo(req, res, next) {const token = req.get("Authorization");const obj = Jwt.verify(token.split(" ")[1], "baoyebabai");console.log(obj.username);const data = await UserModel_DB.find({ username: obj.username });console.log(data);res.send({ data });}
}module.exports = new usercontroller();

2.服務端驗證token

(1) 在utils文件夾下面創建jwt.js文件

// 引入的一個函數
const {expressjwt} = require("express-jwt")//在進行token認證
const jwtAuth = expressjwt({secret:"shuangxiangbabai", //加密的密鑰algorithms:["HS256"], //默認加密采用HS256credentialsRequired:true //true:不管請求有沒有攜帶token,都需要驗證,false:請求沒有帶token不驗證
})module.exports = jwtAuth

(2)需要在app.js中引入jwt.js文件并加載中間件

//引入jwt認證代碼
const jwtAuth = require("./utils/jwt")//指定項目中public為靜態資源 ,這個文件夾里面資源前端直接訪問
app.use(express.static(path.join(__dirname, 'public')));//先驗證token
app.use(jwtAuth)

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

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

相關文章

如何實現Spring Boot應用程序的安全性:全面指南

在現代 Web 開發中,安全性是 Spring Boot 應用程序的核心需求,尤其是在微服務、云原生和公開 API 場景中。Spring Boot 結合 Spring Security 提供了一套強大的工具,用于保護應用程序免受常見威脅,如未經授權的訪問、數據泄露、跨…

無人機避障——Mid360+Fast-lio感知建圖+Ego-planner運動規劃(胎教級教程)

電腦配置:Xavier-nx、ubuntu 18.04、ros melodic 激光雷達:Livox_Mid-360 結果展示:左邊Mid360+Fast-lio感知建圖,右邊Ego-planner運動規劃 1、讀取雷達數據并顯示 無人機避障——感知篇(采用Livox-Mid360激光雷達獲取點云數據顯示)-CSDN博客 看看雷達數據話題imu以及…

數據庫證書可以選OCP認證嗎?

直接回答:國內OCP認證持有者的年薪普遍在15萬到40萬元之間,具體收入與經驗、地區和行業強相關。OCP認證能大幅提升求職競爭力,但薪資天花板仍由個人能力決定。 一、薪資范圍和核心影響因素 OCP認證是Oracle數據庫領域的中高級“技術通行證”…

MySQL 從入門到精通:第二篇 - 數據類型、約束與索引

1. MySQL數據類型詳解 數值類型 整數類型 -- 常用整數類型及范圍 CREATE TABLE integer_types (tiny_col TINYINT, -- 1字節,有符號(-128~127),無符號(0~255)small_col SMALLINT, -- 2字節,有符號(-32768~32767),無符號(0~65535)medium_col MEDIUMINT,

Arduino 入門學習筆記(二):開發環境搭建

Arduino 入門學習筆記(二):開發環境搭建 B站學習鏈接:link 1. Arduino IDE2軟件介紹 Arduino IDE,Arduino Integrated Development Environment,即Arduino集成開發環境。 Arduino IDE具有程序編輯、調試…

ChatGPT、deepseek、豆包、Kimi、通義千問、騰訊元寶、文心一言、智譜清言代碼能力對比

均使用測試時的最強模型 均是一次對話,對話內容一樣 均開啟深度思考 能聯網的都聯網了,但是作用不大,因為藍橋杯剛考完,洛谷題目剛上傳沒多久 問題一測試了兩遍 從問題三開始不再測試智譜清言(它思考時間太長了,前兩個…

OCR之身份證識別

前言 OCR身份證識別是光學字符識別技術在身份證領域的應用。通過掃描或拍照獲取身份證圖像,利用圖像處理、深度學習等技術,自動提取姓名、性別、民族、出生日期、地址、身份證號等信息,可大幅提升信息錄入效率,廣泛應用于政務、金…

線性代數—向量與矩陣的范數(Norm)

參考鏈接: 范數(Norm)——定義、原理、分類、作用與應用 - 知乎 帶你秒懂向量與矩陣的范數(Norm)_矩陣norm-CSDN博客 什么是范數(norm)?以及L1,L2范數的簡單介紹_l1 norm-CSDN博客 范數(Norm…

Java高頻面試之并發編程-08

hello啊,各位觀眾姥爺們!!!本baby今天來報道了!哈哈哈哈哈嗝🐶 面試官:說說sleep和wait的區別? 1. 核心區別總結 特性sleep()wait()所屬類Thread 類的靜態方法Object 類的實例方法…

Spring-Ai-McpSever從外到內

MCP是什么 Model Context Protocol (MCP) 是一個開放協議,它使 LLM 應用與外部數據源和工具之間的無縫集成成為可能。無論你是構建 AI 驅動的 IDE、改善 chat 交互,還是構建自定義的 AI 工作流,MCP 提供了一種標準化的方式,將 LL…

ubuntu22.04 命令行修改靜態ip

傳統interfaces文件配置(適用于舊版)即便我們已經在桌面上配置了固定ip 這里也可以修改 ?編輯配置文件? 修改/etc/network/interfaces(需安裝net-tools): # interfaces(5) file used by ifup(8) and ifdown(8) # In…

計算機網絡學習筆記 4-6章

第 4 章 網絡層 【考綱內容】 (一)網絡層的功能 異構網絡互連;路由與轉發;SDN 基本概念;擁塞控制 (二)路由算法 靜態路由與動態路由;距離 - 向量路由算法&#xff1…

力扣hot100_子串_python版本

一、560. 和為 K 的子數組 思路:這就是一道典型的前綴和的題代碼: class Solution:def subarraySum(self, nums: List[int], k: int) -> int:presum [0] * (len(nums) 1)for i, x in enumerate(nums):presum[i 1] presum[i] x # 前綴和序列需要n1個ans 0…

猿人學web端爬蟲攻防大賽賽題第15題——備周則意怠-常見則不疑

解題步驟 1、觀察抓的包 2、有個m參數,一看就是經過處理的,我們得知道m是如何組成的。看Initiator模塊。 3、還是看request函數,往上一看就看到了m的賦值操作。 打斷點,觸發。 4、看下window.m()的定義 5、比較好理解的&#x…

rag增強檢索-基于關鍵詞檢索的混合檢索模式

1. 為什么在 RAG 里要用關鍵詞檢索? 向量檢索(embedding-based retrieval)是找語義相近的內容,但有時候不夠準確。比如用戶問了具體人名、產品型號、年份,這類關鍵詞強指向性的信息,用向量檢索可能匹配不到最相關內容。**關鍵詞檢索(keyword-based retrieval)**可以直接…

純真社區IP庫離線版發布更新

純真社區IP庫離線版發布更新 發布者:技術分享 2005年,隨著中國互聯網的蓬勃發展,純真IP庫誕生了。作為全球網絡空間地理測繪技術的領先者,純真開源項目為中國互聯網行業提供了高質量的網絡空間IP庫數據。純真IP庫目前已經覆蓋超…

GitOps進化:深入探討 Argo CD 及其對持續部署的影響

什么是 GitOps? 雖然軟件開發生命周期的大部分已經實現自動化,但基礎設施仍然在很大程度上依賴于人工,需要專業團隊的參與。隨著當今基礎設施需求的不斷增長,實施基礎設施自動化變得越來越重要。現代基礎設施需要具備彈性&#x…

通過示例學習:連續 XOR

通過示例學習:連續 XOR 如果我們想在 PyTorch 中構建神經網絡,可以使用 (with) 指定所有參數(權重矩陣、偏差向量),讓 PyTorch 計算梯度,然后調整參數。但是,如果我們有很…

百度Create大會深度解讀:AI Agent與多模態模型如何重塑未來?

目錄 百度Create大會亮點全解析:從數字人到Agent生態布局 數字人商業化:從"擬人"到"高說服力"的進化 Agent生態:從"心響"App看百度的Agent戰略布局 "心響"App的技術架構與創新點 多模態大模型&a…

django filter 日期大于當前日期的

在Django中,如果你想要過濾出日期大于當前日期的記錄,你可以使用Django的QuerySet API中的__gt(大于)操作符。這里是如何做到這一點的步驟: 確定你的模型:首先,確保你有一個模型(Mo…