RESTful 是一种设计 Web 应用程序的架构风格,它通常基于 HTTP 协议,并使用 HTTP 动词(GET、POST、PUT、DELETE)对资源进行管理。它的特点是快速、可扩展、适应性强且易于维护。Express.js 是一个强大的 Node.js 框架,可以轻松构建出 RESTful 风格的应用程序。在本文中,我们将学习如何使用 Express.js 构建一个完整的 RESTful 风格应用程序。
环境和准备工作
在开始前,请确保你已经安装好了以下环境:
- Node.js
- npm
- MongoDB
同时,我们需要安装的一些依赖包:
- Express.js
- body-parser
- mongoose
可以使用以下命令安装:
npm install express body-parser mongoose --save
在安装完成后,我们需要创建项目目录。在该目录下创建一个 server.js
文件,作为我们应用程序的入口文件。
创建 RESTful API
RESTful 风格应用程序的核心是 API 接口。在 Express.js 中,我们可以通过创建路由来定义 API 接口。我们先创建一个 routes
目录,并在里面创建一个 api.js
文件。
在 api.js
中,我们先定义路由的基础路径:
// javascriptcn.com 代码示例 const express = require('express'); const router = express.Router(); router.use((req, res, next) => { console.log('API accessed'); next(); }); router.get('/', (req, res) => { res.send('API Home'); }); module.exports = router;
该路由定义了一个基础路径 /
,并处理 GET 请求,返回 API Home
。此外,我们打印了一个日志,表示该 API 被调用。
在 server.js
中,我们加载并使用此路由:
// javascriptcn.com 代码示例 const express = require('express'); const bodyParser = require('body-parser'); const apiRoutes = require('./routes/api'); const app = express(); const port = process.env.PORT || 3000; app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); app.use('/api', apiRoutes); app.listen(port, () => { console.log(`App listening on port ${port}`); });
现在,我们可以访问 http://localhost:3000/api
,并得到一个 API Home
的响应。
连接 MongoDB 数据库
在大多数情况下,RESTful 风格应用程序需要与数据库进行交互。在本文中,我们将使用 MongoDB 作为我们的数据库。首先,安装 mongoose
包。
npm install mongoose --save
在 server.js
中,我们定义了 MongoDB 数据库的连接:
const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/restfulapp', { useNewUrlParser: true }); const db = mongoose.connection; db.on('error', console.error.bind(console, 'MongoDB connection error:'));
在这里,我们通过 mongoose.connect
连接到名为 restfulapp
的 MongoDB 数据库,并在出错时打印了一个错误日志。
创建资源
在 RESTful 风格应用程序中,我们使用 HTTP 动词来操作资源。这些动词包括 GET、POST、PUT、DELETE 等。 我们将使用 mongoose
来定义和操作数据库的资源。我们先在 models
目录中创建一个 user.js
文件,该文件定义了一个用户模型,如下所示:
// javascriptcn.com 代码示例 const mongoose = require('mongoose'); const Schema = mongoose.Schema; const userSchema = new Schema({ firstName: { type: String, required: true }, lastName: { type: String, required: true }, email: { type: String, required: true, unique: true }, dateCreated: { type: Date, default: Date.now }, }); const User = mongoose.model('User', userSchema); module.exports = User;
这里定义了一个名为 User
的模型,该模型包含了用户的 firstName
、lastName
、email
和 dateCreated
等属性。为了保证 email 的唯一性,我们设置了该属性的 unique
属性为 true
。
定义 API 接口
现在,我们已经有了一个包含资源的数据模型。我们可以使用这些资源来定义 API 接口。在 api.js
中,我们定义了以下路由:
// javascriptcn.com 代码示例 const express = require('express'); const router = express.Router(); const User = require('../models/user'); router.use((req, res, next) => { console.log('API accessed'); next(); }); router.route('/users') .get((req, res) => { User.find((err, users) => { if (err) res.send(err); res.json(users); }); }) .post((req, res) => { const user = new User(req.body); user.save((err) => { if (err) res.send(err); res.json({ message: 'User created!' }); }); }); router.route('/users/:user_id') .get((req, res) => { User.findById(req.params.user_id, (err, user) => { if (err) res.send(err); res.json(user); }); }) .put((req, res) => { User.findById(req.params.user_id, (err, user) => { if (err) res.send(err); user.firstName = req.body.firstName; user.lastName = req.body.lastName; user.email = req.body.email; user.save((err) => { if (err) res.send(err); res.json({ message: 'User updated!' }); }); }); }) .delete((req, res) => { User.remove({ _id: req.params.user_id }, (err) => { if (err) res.send(err); res.json({ message: 'Successfully deleted' }); }); }); module.exports = router;
该路由定义了两个 RESTful 风格的路由: /users
和 /users/:user_id
,分别对应于所有用户和单个用户的操作。其中,get()
方法获取所有用户,post()
方法创建一个新用户,get(user_id)
方法获取单个用户,put(user_id)
方法更新单个用户,delete(user_id)
方法删除单个用户。
现在,我们可以使用 POSTMAN 或 CURL 等工具来测试这些 API 接口。
总结
在本文中,我们学习了如何使用 Express.js 框架来构建 RESTful 风格的应用程序,并使用了 MongoDB 来保存和操作资源数据。我们定义了一些 RESTful API 接口,对用户资源执行 CRUD 操作。我们还学习了使用 mongoose
来定义和操作数据库的数据模型。如果您想学习更多有关 Express.js 的内容,可以查看我们的其他学习资源。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654f15207d4982a6eb81a95a