在Node.js开发中,Express是一个非常常用的框架,而Mongoose则是一个非常流行的对象文档映射工具,用于连接MongoDB数据库。本文将介绍如何使用Express和Mongoose连接MongoDB,并进行相关的操作示例。
1. 安装Express和Mongoose
在开始之前,必须先安装Express和Mongoose,可以通过npm进行安装。在命令行中输入以下命令:
npm install express mongoose --save
其中,`--save`参数可以将安装信息保存到`package.json`文件中,方便后续管理。
2. 配置Express应用
在开始连接MongoDB前,首先需要进行Express应用的基本配置。在项目根目录下创建`app.js`文件,并输入以下内容:
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
const port = 3000;
app.listen(port, () => {
console.log(`App listening at http://localhost:${port}`);
});
以上代码中,我们导入了`express`库,并将其赋值给`app`变量。接着,我们使用`app.use`方法,分别启用了JSON解析和url编码解析中间件。最后通过`app.listen`方法启动Express应用。
3. 连接MongoDB
接下来,我们需要使用Mongoose来连接MongoDB数据库。在`app.js`中添加以下代码:
const mongoose = require('mongoose');
const mongoURI = 'mongodb://localhost/my_database';
mongoose.connect(mongoURI, {
useNewUrlParser: true,
useUnifiedTopology: true
}).then(() => {
console.log('MongoDB connected');
}).catch(error => {
console.log(error);
});
以上代码中,我们首先导入了`mongoose`库。接下来,我们定义了连接MongoDB所需要的URI,即`mongodb://localhost/my_database`。如果MongoDB实例不是运行在本机,可以将`localhost`替换成对应的主机名或IP地址。`my_database`指定了要连接的数据库名称,如果该数据库不存在,则会自动创建。
接着,我们使用`mongoose.connect`方法来连接MongoDB,并传入连接选项。其中,`useNewUrlParser`和`useUnifiedTopology`分别用于告知Mongoose使用MongoDB驱动新的解析器和拓扑结构引擎。最后,我们在`then`回调函数中打印连接成功的信息,在`catch`回调函数中打印连接失败的原因。
4. 定义数据模型
在使用Mongoose进行数据操作前,需要先定义数据模型。在`app.js`文件中添加以下代码:
const mongoose = require('mongoose');
const todoSchema = new mongoose.Schema({
title: {
type: String,
required: true
},
completed: {
type: Boolean,
default: false
},
createdAt: {
type: Date,
default: Date.now
}
});
const Todo = mongoose.model('Todo', todoSchema);
以上代码中,我们首先定义了一个名为`todoSchema`的Mongoose schema。该schema定义了Todo数据的字段和类型,其中`title`为必填字段,类型为字符串;`completed`为选填字段,类型为布尔值,初始值为`false`;`createdAt`为只读字段,类型为日期类型,初始值为当前时间。
接着,我们使用`mongoose.model`方法将`todoSchema`与名为`Todo`的模型绑定。此时,我们就可以使用`Todo`模型对MongoDB中的`todo`集合进行操作了。
5. 增删改查数据
接下来,我们将使用`Todo`模型进行增删改查操作。在`app.js`文件中添加以下代码:
5.1 添加新数据
app.post('/todos', async (req, res) => {
try {
const todo = new Todo(req.body);
await todo.save();
res.status(201).json(todo);
} catch (error) {
console.log(error);
res.status(500).json({ message: 'Server error' });
}
});
以上代码中,我们使用`app.post`方法创建了一个路由,当发起POST请求时,会执行以下操作:
1. 从请求体中获取`title`和`completed`字段的值。
2. 创建一个`Todo`实例,并传入上述两个字段的值。
3. 使用`await`关键字调用`save`方法,将新数据保存到MongoDB中。
4. 使用`res.status`方法设置响应码为201,并返回新增的`todo`对象。
如果在这个过程中出现了错误,将打印错误信息,并返回500状态码和错误信息。
5.2 获取全部数据
app.get('/todos', async (req, res) => {
try {
const todos = await Todo.find();
res.json(todos);
} catch (error) {
console.log(error);
res.status(500).json({ message: 'Server error' });
}
});
以上代码中,我们使用`app.get`方法创建一个路由,当发起GET请求时,会执行以下操作:
1. 使用`await`关键字调用`Todo.find`方法,获取MongoDB中`todo`集合中的全部数据。
2. 使用`res.json`方法将查询结果返回给客户端。
如果查询过程中出现了错误,将打印错误信息,并返回500状态码和错误信息。
5.3 获取指定数据
app.get('/todos/:id', async (req, res) => {
try {
const todo = await Todo.findById(req.params.id);
if (!todo) {
return res.status(404).json({ message: 'Todo not found' });
}
res.json(todo);
} catch (error) {
console.log(error);
res.status(500).json({ message: 'Server error' });
}
});
以上代码中,我们使用`app.get`方法创建一个路由,当发起GET请求时,会执行以下操作:
1. 使用`Todo.findById`方法,根据路由参数中的`id`值,获取MongoDB中`todo`集合中指定的一条数据。
2. 如果该数据不存在,则返回404状态码和错误信息。
3. 如果查询成功,使用`res.json`方法将查询结果返回给客户端。
如果查询过程中出现了错误,将打印错误信息,并返回500状态码和错误信息。
5.4 更新一条数据
app.put('/todos/:id', async (req, res) => {
try {
const todo = await Todo.findByIdAndUpdate(req.params.id, req.body, {
new: true
});
if (!todo) {
return res.status(404).json({ message: 'Todo not found' });
}
res.json(todo);
} catch (error) {
console.log(error);
res.status(500).json({ message: 'Server error' });
}
});
以上代码中,我们使用`app.put`方法创建一个路由,当发起PUT请求时,会执行以下操作:
1. 使用`Todo.findByIdAndUpdate`方法,根据路由参数中的`id`值,更新MongoDB中`todo`集合中指定的一条数据。
2. 将请求体中的数据作为更新的内容。
3. 使用`{ new: true }`选项表示返回更新后的数据。
4. 如果更新的数据不存在,返回404状态码和错误信息。
5. 如果成功更新数据,使用`res.json`方法将更新后的数据返回给客户端。
如果更新过程中出现了错误,将打印错误信息,并返回500状态码和错误信息。
5.5 删除一条数据
app.delete('/todos/:id', async (req, res) => {
try {
const todo = await Todo.findByIdAndDelete(req.params.id);
if (!todo) {
return res.status(404).json({ message: 'Todo not found' });
}
res.json(todo);
} catch (error) {
console.log(error);
res.status(500).json({ message: 'Server error' });
}
});
以上代码中,我们使用`app.delete`方法创建一个路由,当发起DELETE请求时,会执行以下操作:
1. 使用`Todo.findByIdAndDelete`方法,根据路由参数中的`id`值,从MongoDB中`todo`集合中删除一条数据。
2. 如果删除的数据不存在,返回404状态码和错误信息。
3. 如果成功删除数据,使用`res.json`方法将删除的数据返回给客户端。
如果删除过程中出现了错误,将打印错误信息,并返回500状态码和错误信息。
6. 总结
本文介绍了如何使用Express和Mongoose连接MongoDB,并对数据进行增删改查操作。通过本文的示例代码,相信读者可以快速学习如何使用Express和Mongoose进行MongoDB数据库操作。