项目初始化与环境搭建
公司来了一批实习生,为了让大家更快的上手干活,写了一个从零开始简单的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才行!