【Node.js】Express+MongoDB搭建项目到Docker部署全流程(从CRUD到生产环境)

项目初始化与环境搭建

公司来了一批实习生,为了让大家更快的上手干活,写了一个从零开始简单的CRUD应用培训使用,并通过Docker将其部署到服务器上。

1.1 创建项目

首先,创建一个新的项目目录并初始化Node.js项目。

mkdir node-crud-app
cd node-crud-app
npm init -y

1.2 安装依赖

安装Express.js和MongoDB驱动程序。

npm install express mongoose

1.3 创建项目结构

创建以下文件和目录结构:

node-crud-app/
├── src/
│   ├── app.js
│   ├── models/
│   │   └── user.js
│   ├── routes/
│   │   └── userRoutes.js
│   └── config/
│       └── db.js
└── package.json

数据库连接与模型定义

2.1 连接MongoDB

在config/db.js中配置MongoDB连接。

const mongoose = require('mongoose');

const connectDB = async () => {
  try {
    await mongoose.connect('mongodb://localhost:27017/node-crud-app', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
    console.log('MongoDB connected successfully');
  } catch (err) {
    console.error('MongoDB connection error:', err);
    process.exit(1);
  }
};

module.exports = connectDB;

2.2 定义User模型

在models/user.js中定义用户数据模型。

const mongoose = require('mongoose');

const UserSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
    unique: true,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

module.exports = mongoose.model('User', UserSchema);

构建CRUD API

3.1 创建路由

在routes/userRoutes.js中定义用户相关的路由。

const express = require('express');
const router = express.Router();
const User = require('../models/user');

// 创建用户
router.post('/', async (req, res) => {
  try {
    const user = new User(req.body);
    await user.save();
    res.status(201).json(user);
  } catch (err) {
    res.status(400).json({ message: err.message });
  }
});

// 获取所有用户
router.get('/', async (req, res) => {
  try {
    const users = await User.find();
    res.json(users);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

// 获取单个用户
router.get('/:id', async (req, res) => {
  try {
    const user = await User.findById(req.params.id);
    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }
    res.json(user);
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

// 更新用户
router.put('/:id', async (req, res) => {
  try {
    const user = await User.findByIdAndUpdate(req.params.id, req.body, { new: true });
    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }
    res.json(user);
  } catch (err) {
    res.status(400).json({ message: err.message });
  }
});

// 删除用户
router.delete('/:id', async (req, res) => {
  try {
    const user = await User.findByIdAndDelete(req.params.id);
    if (!user) {
      return res.status(404).json({ message: 'User not found' });
    }
    res.json({ message: 'User deleted successfully' });
  } catch (err) {
    res.status(500).json({ message: err.message });
  }
});

module.exports = router;

3.2 配置应用

在src/app.js中配置Express应用。

const express = require('express');
const connectDB = require('./config/db');
const userRoutes = require('./routes/userRoutes');

const app = express();

// 中间件
app.use(express.json());

// 连接数据库
connectDB();

// 路由
app.use('/api/users', userRoutes);

// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

运行与测试

4.1 启动MongoDB

确保MongoDB服务已启动,可以使用以下命令启动MongoDB(假设已安装)。

mongod

4.2 启动应用

运行应用并测试API。

node src/app.js

使用Postman或curl测试API:

  • 创建用户:POST http://localhost:3000/api/users
  • 获取所有用户:GET http://localhost:3000/api/users
  • 获取单个用户:GET http://localhost:3000/api/users/:id
  • 更新用户:PUT http://localhost:3000/api/users/:id
  • 删除用户:DELETE http://localhost:3000/api/users/:id

Docker化应用

5.1 创建Dockerfile

在项目根目录下创建Dockerfile。

FROM node:16

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000

CMD ["node", "src/app.js"]

5.2 构建Docker镜像

构建Docker镜像。

docker build -t node-crud-app .

5.3 运行Docker容器

运行Docker容器。

docker run -p 3000:3000 -d node-crud-app

部署到服务器

6.1 上传镜像到Docker Hub

将镜像推送到Docker Hub。

docker tag node-crud-app yourusername/node-crud-app
docker push yourusername/node-crud-app

6.2 在服务器上拉取并运行镜像

在目标服务器上拉取并运行镜像。

docker pull yourusername/node-crud-app
docker run -p 3000:3000 -d yourusername/node-crud-app

总结

这一流程涵盖了Express+MongoDB从开发到部署的完整过程。如果还没有安装MongoDB可以到这里去下载(https://www.mongodb.com/try/download/community)我使用的是4.0.17版本,根据自己项目情况去下载对应版本。还可以安装MongoDB Compass(GUI工具)来帮助开发者更方便的使用数据库。(https://www.mongodb.com/try/download/compass)Compass使用要启动MongoDB才行!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值