一、前言
在 Node.js 应用中,路由用于处理不同的 URL 路径请求,决定应该执行什么操作;而 Mongoose 用于与 MongoDB 数据库进行交互,如进行数据的存储、查询、更新和删除。它们结合使用可以构建功能强大的 Web 应用,实现根据不同的请求对数据库进行相应的操作。
二、以 Express 框架为例说明结合方式
1. 项目设置与基础依赖安装
首先创建一个 Node.js 项目,npm init生成package.json,在项目目录下通过npm install express mongoose
安装 Express 和 Mongoose。假设还使用body - parser
中间件来处理请求体数据(在 Express 4.16 + 版本中,express.urlencoded
和express.json
中间件已经内置,可以代替body - parser
部分功能)。
2. 连接数据库(使用 Mongoose)
在项目的入口文件(如app.js
)中,引入 Mongoose 并连接到数据库。
js
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost:27017/your_database_name', {
useNewUrlParser: true,
useUnifiedTopology: true
});
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function() {
console.log("Connected to MongoDB successfully");
});
这里your_database_name
是要连接的数据库名称,连接选项useNewUrlParser
和useUnifiedTopology
是为了避免一些连接警告和问题。
3. 定义数据模型(使用 Mongoose)
在单独的文件(如models/user.js
)中定义数据模型。例如,定义一个用户模型:
js
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
age: {
type: Number,
default: 0
},
email: {
type: String,
unique: true,
match: /^\S+@\S+\.\S+$/
}
});
const User = mongoose.model('User', userSchema);
module.exports = User;
4. 创建路由(使用 Express)并结合 Mongoose 操作
在app.js
或者专门的路由文件(如routes/userRoutes.js
)中创建路由,并在路由处理函数中使用 Mongoose 模型进行数据库操作。
查询操作示例:
js
const express = require('express');
const router = express.Router();
const User = require('../models/user');
// 查询所有用户的路由
router.get('/users', async (req, res) => {
try {
const users = await User.find();
res.send(users);
} catch (e) {
console.error(e);
res.status(500).send({ error: 'Internal Server Error' });
}
});
module.exports = router;
这里定义了一个GET /users
路由,当客户端发送请求到这个路径时,会调用async
函数。在函数内部,使用User.find()
方法(User
是之前定义的 Mongoose 模型)查询所有用户数据。如果查询成功,将用户数据发送回客户端;如果出现错误,返回500
错误状态码和错误信息。
插入操作示例:
js
// 插入新用户的路由
router.post('/users', async (req, res) => {
try {
const newUser = new User(req.body);
await newUser.save();
res.send(newUser);
} catch (e) {
console.error(e);
res.status(400).send({ error: 'Bad Request' });
}
});
对于POST /users
路由,当客户端发送数据到这个路径时,会创建一个新的User
对象(使用req.body
中的数据),然后将其保存到数据库中。如果保存成功,将新用户数据发送回客户端;如果出现错误(如数据验证不通过),返回400
错误状态码和错误信息。
更新操作示例:
js
// 更新用户信息的路由
router.put('/users/:id', async (req, res) => {
try {
const { id } = req.params;
const updatedUser = await User.findByIdAndUpdate(id, req.body, {
new: true
});
if (!updatedUser) {
res.status(404).send({ error: 'User not found' });
} else {
res.send(updatedUser);
}
} catch (e) {
console.error(e);
res.status(500).send({ error: 'Internal Server Error' });
}
});
在PUT /users/:id
路由中,:id
是路由参数,表示要更新的用户的唯一标识符。通过req.params
获取id
,然后使用User.findByIdAndUpdate
方法根据id
找到用户并更新其信息(req.body
包含更新的数据)。如果new: true
选项被设置,会返回更新后的用户对象。如果找不到用户,返回404
错误状态码和错误信息;如果出现其他错误,返回500
错误状态码和错误信息。
删除操作示例:
js
// 删除用户的路由
router.delete('/users/:id', async (req, res) => {
try {
const { id } = req.params;
const deletedUser = await User.findByIdAndDelete(id);
if (!deletedUser) {
res.status(404).send({ error: 'User not found' });
} else {
res.send({ message: 'User deleted successfully' });
}
} catch (e) {
console.error(e);
res.status(500).send({ error: 'Internal Server Error' });
}
});
在DELETE /users/:id
路由中,同样通过req.params
获取id
,然后使用User.findByIdAndDelete
方法根据id
删除用户。如果找不到用户,返回404
错误状态码和错误信息;如果删除成功,返回成功消息;如果出现其他错误,返回500
错误状态码和错误信息。