使用 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. 配置项目启动信息

javascript 复制代码
// 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

注意要是端口占用,直接手动修改端口号,直到命令行输出成功启动!

javascript 复制代码
[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代码的注释 (方便理解代码!)

javascript 复制代码
/**
 * (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文件

javascript 复制代码
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

javascript 复制代码
// 处理项目中日志,第三方写好插件
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"

  1. 启动完成后在任务管理器中可以看得

启动不成功!请参考以下文章!【亲身实践已解决】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里面加入代码

javascript 复制代码
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文件

javascript 复制代码
// 引入的一个函数
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文件并加载中间件

javascript 复制代码
//引入jwt认证代码
const jwtAuth = require("./utils/jwt")

//指定项目中public为静态资源 ,这个文件夹里面资源前端直接访问
app.use(express.static(path.join(__dirname, 'public')));

//先验证token
app.use(jwtAuth)
相关推荐
学地理的小胖砸1 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1231 小时前
Redis解析
数据库·redis·缓存
数据库幼崽1 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd2 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou2 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh3 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵4 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多5 小时前
Linux——mysql主从复制与读写分离
数据库·mysql
初次见面我叫泰隆5 小时前
MySQL——1、数据库基础
数据库·adb
Chasing__Dreams5 小时前
Redis--基础知识点--26--过期删除策略 与 淘汰策略
数据库·redis·缓存