本文将详细介绍如何使用 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 development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.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
方法一:配置文件方式启动服务
- 在MongoDB安装路径下,在bin同级新建conf文件夹;
- 在该文件中,用文件文档建立 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 并设置为开机自启
- 在MongoDB文件下新建data 然后新建db 顺序是这样:D:\MongoDB\data\db
在
MongoDB下新建文件夹log
(存放日志文件),并且在里面新建文件mongodb.log
- 在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"], //默认加密采用HS256
credentialsRequired: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)