如何使用 Express.js 和 MongoDB 构建 CRUD 应用程序
前言:Express.js 是一个非常流行的 Node.js Web 框架,能够让我们迅速构建高质量的 Web 应用程序。MongoDB 是一个广泛使用的 NoSQL 数据库,它的灵活性和可伸缩性使得它成为构建实时 Web 应用程序的理想选择。在本文中,我们将介绍如何使用 Express.js 和 MongoDB 来构建一个完整的 CRUD 应用程序,包括创建、读取、更新、删除操作。
环境搭建
在开始搭建环境之前,确保您已经安装了 Node.js 和 MongoDB。可以从下面的链接下载和安装它们:
完成安装后,我们可以创建一个新项目,并将依赖项添加到我们的 package.json
文件中:
mkdir express-mongo-crud cd express-mongo-crud npm init -y npm i express mongoose npm i --save-dev nodemon
通过以上命令,我们在本地创建了一个名为 express-mongo-crud
的项目,并添加了 Express.js 和 MongoDB 的依赖项。此外,我们还添加了 nodemon,以便在开发过程中能够自动重启服务器。
连接到 MongoDB
首先,我们需要配置连接到 MongoDB 的数据库。在项目的根目录下创建一个名为 config
的文件夹,并创建一个名为 db.js
的文件。
在 db.js
文件中,我们要通过 Mongoose 库来连接到 MongoDB 数据库。在连接成功后,我们可以使用 mongoose.connection
对象实例化数据库,并在全局对象中注册连接实例。下面是 db.js
文件的示例代码:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const dbURI = 'mongodb://localhost:27017/mydb'; // 修改成自己的 Mongodb 链接 mongoose.connect( dbURI, { useNewUrlParser: true, useUnifiedTopology: true, useCreateIndex: true, useFindAndModify: false, }, () => { console.log('MongoDB 连接成功!'); } ); mongoose.connection.on('error', (err) => { console.log(`MongoDB 连接失败: ${err}`); }); mongoose.connection.on('disconnected', () => { console.log('MongoDB 断开连接!'); }); process.on('SIGINT', () => { mongoose.connection.close(() => { console.log('MongoDB 断开了!我们的应用程序终止执行'); process.exit(0); }); }); global.db = mongoose.connection;
在代码中,我们导出了一个连接实例作为 db
属性的全局对象,以便其他文件可以使用它。
创建 Express.js 应用程序
接下来,让我们创建一个 Express.js 应用程序。在项目根目录下创建一个名为 app.js
的文件,并使用以下示例代码初始化 Express.js 应用程序:
// javascriptcn.com 代码示例 const express = require('express'); const app = express(); const port = process.env.PORT || 3000; app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.listen(port, () => { console.log(`应用程序启动成功,正在监听端口 ${port}`); });
在代码中,我们首先导入了 Express.js 库,并使用 app()
创建了一个应用程序实例。然后启动了服务器并监听端口 3000
。这里使用了一个环境变量 process.env.PORT
,它表示你可以使用系统的环境变量 PORT
进行端口配置,如果没有环境变量,就使用 3000。
接下来,我们需要创建四个路由来实现 CRUD 操作。
创建资源
第一个路由控制器将用于保存新资源到数据库中。在 routes
目录下创建一个名为 index.js
的文件,并使用以下示例代码添加路由控制器:
// javascriptcn.com 代码示例 const express = require('express'); const router = express.Router(); const mongoose = require('mongoose'); router.post('/api/messages', (req, res) => { if (!req.body.title || !req.body.message) { return res.status(400).send({ message: '缺少必要数据!' }); } const Message = mongoose.model('Message'); const newMessage = new Message({ title: req.body.title, message: req.body.message }); newMessage.save((err, message) => { if (err) { return res.status(500).send({ message: '保存失败!' }); } return res.status(201).send({ message: '保存成功!', message }); }); }); module.exports = router;
在代码中,我们首先判断是否存在必要的数据,如果没有,返回一个 400 Bad Request
状态码和一个错误消息。否则,我们将实例化一个 Mongoose 模型对象并将其存储到数据库中,并返回一个 201 Created
状态码和存储的信息。
获取资源
第二个路由控制器将用于检索所有存在于数据库中的资源。在 routes
目录下,再创建一个名为 messages.js
的文件,并使用以下示例代码添加路由控制器:
// javascriptcn.com 代码示例 const express = require('express'); const router = express.Router(); const mongoose = require('mongoose'); router.get('/api/messages', (req, res) => { const Message = mongoose.model('Message'); Message.find({}, (err, messages) => { if (err) { return res.status(500).send({ message: '获取数据失败!' }); } return res.status(200).send(messages); }); }); module.exports = router;
在代码中,我们首先检索所有消息的集合,然后将它们发送到客户端。如果发生错误(如无法连接到数据库),则会返回一个 500 Internal Server Error
状态码。
更新资源
第三个路由控制器将用于在数据库中更新现有资源。在 routes
目录下,创建一个名为 messages.js
的文件,并使用以下示例代码添加路由控制器:
// javascriptcn.com 代码示例 const express = require('express'); const router = express.Router(); const mongoose = require('mongoose'); router.put('/api/messages/:id', (req, res) => { if (!req.body.title && !req.body.message) { return res.status(400).send({ message: '缺少必要数据!' }); } const Message = mongoose.model('Message'); Message.findByIdAndUpdate( req.params.id, { title: req.body.title || '', message: req.body.message || '' }, { new: true }, (err, message) => { if (err) { return res.status(500).send({ message: '更新失败!' }); } if (!message) { return res.status(404).send({ message: '消息不存在!' }); } return res.status(200).send({ message: '更新成功!', message }); } ); }); module.exports = router;
在代码中,我们首先检查是否传入了必要数据,如果没有,则返回一个错误消息。否则,我们将使用 Message.findByIdAndUpdate()
函数更新记录,并返回一个 200 OK
状态码和更新的消息。
删除资源
第四个路由控制器将用于删除现有资源。在 routes
目录下,创建一个名为 messages.js
的文件,并使用以下示例代码添加路由控制器:
// javascriptcn.com 代码示例 const express = require('express'); const router = express.Router(); const mongoose = require('mongoose'); router.delete('/api/messages/:id', (req, res) => { const Message = mongoose.model('Message'); Message.findByIdAndDelete(req.params.id, (err, message) => { if (err) { return res.status(500).send({ message: '删除失败!' }); } if (!message) { return res.status(404).send({ message: '消息不存在!' }); } return res.status(200).send({ message: '删除成功!' }); }); }); module.exports = router;
在代码中,我们首先使用 Message.findByIdAndDelete()
函数查找特定消息并删除它。如果操作成功,则返回一个 200 OK
状态码并返回一个成功消息。如果消息不存在,则返回一个 400 Bad Request
状态码以及一个消息。
在应用程序中使用路由
现在我们已经定义并实现了路由,为了使用这些路由控制器,我们需要将它们引入到我们的应用程序中。
在 app.js
文件中添加以下代码:
const indexRouter = require('./routes/index'); const messagesRouter = require('./routes/messages'); app.use(indexRouter); app.use(messagesRouter);
在代码中,我们首先导入新创建的路由文件,然后将它们添加到应用程序中间件中。现在,访问 http://localhost:3000/api/messages
就会返回包含数据库中所有消息的响应。
测试应用程序
现在我们已经创建了完整的 CRUD 应用程序,开始测试它。运行以下命令启动应用程序:
npm run dev
这将使用 nodemon
启动服务器,并监听 3000
端口。现在,您可以使用 Postman 或您喜欢使用的其他工具来测试我们的应用程序。
在 Postman 中,使用 POST 请求 http://localhost:3000/api/messages
,并在请求主体中添加 JSON 数据:
{ "title": "测试标题", "message": "测试消息" }
您应该看到一个包含我们添加的消息的响应。接着,使用 GET 请求 http://localhost:3000/api/messages
,您应该看到所有保存的消息的列表。使用 PUT 和 DELETE 请求测试更新和删除操作。
总结
通过本文,您学习了如何使用 Express.js 和 MongoDB 构建完整的 CRUD 应用程序。我们了解了如何连接到 MongoDB 数据库,并使用 Mongoose 库来执行标准的 CRUD 操作。我们还了解了如何使用 Express.js 的路由控制器在应用程序中进行集成。希望这篇文章对您有所帮助!
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652e29807d4982a6ebf37084