从零开始搭建一个RESTful API(Node.js + Express)

embedded/2025/1/12 17:51:50/

       随着Web开发的普及,RESTful API已经成为开发者在后端开发中的常见方式。RESTful API通过标准的HTTP方法(GET、POST、PUT、DELETE)实现客户端和服务器之间的通信,使得前后端开发能够解耦,前端可以通过API获取数据并进行展示。本篇博客将带你从零开始使用Node.jsExpress搭建一个简单的RESTful API。

1. 环境准备

       在开始编写代码之前,我们需要准备开发环境:

  • Node.js:Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,主要用于开发服务器端应用。
  • Express:Express 是一个简洁且灵活的 Node.js Web 应用框架,提供了一系列强大的功能用于开发 Web 和移动应用。

安装步骤

  1. 安装Node.js(如果还没有安装)。

  2. 创建一个项目文件夹并初始化Node.js项目:

    mkdir my-rest-api
    cd my-rest-api
    npm init -y
    
  3. 安装Express:

    npm install express --save
    

       现在我们已经安装好了Express,可以开始搭建API了。

2. 基础RESTful API实现
2.1 创建server.js

       在项目根目录中创建一个文件 server.js,并初始化我们的Express服务器:

const express = require('express');
const app = express();
const PORT = 3000;app.use(express.json());// 基础的GET请求
app.get('/', (req, res) => {res.send('欢迎来到我的RESTful API!');
});// 启动服务器
app.listen(PORT, () => {console.log(`服务器正在运行,地址:http://localhost:${PORT}`);
});

       运行该文件:

node server.js

       现在,你可以打开浏览器访问 http://localhost:3000,看到“欢迎来到我的RESTful API!”的提示,说明服务器已经成功运行。

2.2 定义路由和基本操作

       接下来,我们将定义基本的CRUD(Create、Read、Update、Delete)操作。为了模拟数据,我们使用内存中的数据存储,而不需要数据库。

let items = [{ id: 1, name: 'item1' },{ id: 2, name: 'item2' },{ id: 3, name: 'item3' },
];// 获取所有物品
app.get('/api/items', (req, res) => {res.json(items);
});// 获取单个物品
app.get('/api/items/:id', (req, res) => {const item = items.find(i => i.id === parseInt(req.params.id));if (!item) return res.status(404).send('物品未找到');res.json(item);
});// 创建新物品
app.post('/api/items', (req, res) => {const newItem = {id: items.length + 1,name: req.body.name,};items.push(newItem);res.status(201).json(newItem);
});// 更新物品
app.put('/api/items/:id', (req, res) => {const item = items.find(i => i.id === parseInt(req.params.id));if (!item) return res.status(404).send('物品未找到');item.name = req.body.name;res.json(item);
});// 删除物品
app.delete('/api/items/:id', (req, res) => {const item = items.find(i => i.id === parseInt(req.params.id));if (!item) return res.status(404).send('物品未找到');const index = items.indexOf(item);items.splice(index, 1);res.json(item);
});

       在这个代码块中,我们实现了以下RESTful API的基础操作:

  • GET /api/items:获取所有物品。
  • GET /api/items/:id:根据物品的ID获取单个物品。
  • POST /api/items:添加一个新的物品。
  • PUT /api/items/:id:更新已有物品。
  • DELETE /api/items/:id:删除物品。

       你可以使用工具如Postman或curl来测试这些API接口。

3. 处理错误和数据验证

       API设计的一个重要部分是处理错误。我们应该确保每个API请求都能返回清晰明确的错误信息。例如,当用户请求一个不存在的物品时,我们已经返回了404错误。

       此外,在创建或更新物品时,我们应该确保数据有效。我们可以在POST和PUT请求中进行简单的验证:

app.post('/api/items', (req, res) => {if (!req.body.name || req.body.name.length < 3) {return res.status(400).send('名称不能为空且长度必须大于3');}const newItem = {id: items.length + 1,name: req.body.name,};items.push(newItem);res.status(201).json(newItem);
});app.put('/api/items/:id', (req, res) => {const item = items.find(i => i.id === parseInt(req.params.id));if (!item) return res.status(404).send('物品未找到');if (!req.body.name || req.body.name.length < 3) {return res.status(400).send('名称不能为空且长度必须大于3');}item.name = req.body.name;res.json(item);
});

       这里我们添加了对物品名称的验证,确保名称不为空且长度大于3个字符。如果数据无效,API将返回400状态码和相应的错误信息。

4. 使用Postman测试API

       为了验证API的正确性,我们可以使用Postman等工具进行测试。下面是简单的测试步骤:

  1. GET /api/items:返回所有物品列表。
  2. GET /api/items/:id:尝试获取一个存在或不存在的物品ID,查看API返回的正确响应。
  3. POST /api/items:使用有效和无效的物品名称,测试API的创建功能和验证逻辑。
  4. PUT /api/items/:id:测试物品的更新操作,查看是否能够正确更新名称。
  5. DELETE /api/items/:id:测试删除操作,查看API返回的结果。
5. 项目总结

       在这篇博客中,我们从零开始构建了一个简单的RESTful API。通过Express框架,我们快速定义了API的路由,并实现了GET、POST、PUT、DELETE等基础的操作。同时我们还处理了错误和数据验证,确保API能够稳定运行。

       虽然这个项目非常基础,但已经涵盖了RESTful API开发中的核心理念。通过这个例子,你可以轻松将其扩展到更复杂的项目中,例如引入数据库、用户认证、文件上传等功能。

       未来可以考虑扩展的部分:

  • 使用MongoDB或MySQL等数据库:将数据存储到持久化数据库,而不是内存中。
  • 用户认证:通过JWT(JSON Web Token)或OAuth 2.0实现用户认证。
  • 更多高级功能:例如分页、过滤、搜索等功能。

http://www.ppmy.cn/embedded/153346.html

相关文章

ip属地功能有什么作用?自己的ip属地哪里看

虽然现在各大平台纷纷推出了IP属地功能。但是很多小伙伴还是不太了解&#xff0c;为什么要开启这个功能&#xff0c;那么&#xff0c;IP属地功能究竟有哪些作用&#xff1f;又该如何查看自己的IP属地信息呢&#xff1f;本文将为您一一解答。 一、IP属地功能有什么作用 ‌IP属地…

element plus 使用 el-tree 组件设置默认选中和获取所有选中节点id

1. 设置默认选中&#xff1a; 使用 default-checked-keys 属性&#xff0c;设置默认要选中的节点&#xff0c;以数组形式&#xff0c;如下&#xff1a; <el-treeref"treeRef":data"data"show-checkboxnode-key"id":props"defaultProps…

【Python项目】基于深度学习的身份证识别考勤系统

【Python项目】基于深度学习的身份证识别考勤系统 技术简介&#xff1a;采用Python技术、MYSQL数据库等实现。 系统简介&#xff1a;首先会把总用户数、总打卡数、当前年份以及当前月份等等各种信息一一统计出来&#xff1b;新增用户就是通过训呼信息的方式输入&#xff0c;将用…

移动支付安全:五大威胁及防护策略

随着移动支付的普及和便利&#xff0c;越来越多的用户选择通过支付应用进行日常交易。根据艾利德市场研究公司&#xff08;Allied Market Research&#xff09;的报告&#xff0c;全球移动支付市场预计到2027年将超过12万亿美元。然而&#xff0c;随着市场的增长&#xff0c;移…

K8S集群更新api-sever证书的SAN属性

一、场景 1、当你的api-server需要更新API 服务器的地址和端口号就会使用到SAN属性证书。 2、查看证书的SAN属性 openssl x509 -in server.crt -text -noout | grep -A1 "Subject Alternative Name" *192.168.91.105是我更新的kube-vip进去,这样如果访问 192.168.9…

springboot + vue+elementUI图片上传流程

1.实现背景 前端上传一张图片&#xff0c;存到后端数据库&#xff0c;并将图片回显到页面上。上传组件使用现成的elementUI的el-upload。、 2.前端页面 <el-uploadclass"upload-demo"action"http://xxxx.xxx.xxx:9090/file/upload" :show-file-list&q…

Mysql连接报错排查解决记录

Mysql连接报错排查解决记录 背景&#xff1a; 系统&#xff1a;uos server-1060e​ 运行环境kvm虚拟机​ mysql版本&#xff1a;5.7.44, for Linux (x86_64)问题现象&#xff1a; 宿主机重启后&#xff0c;kvm虚拟机内的mysql服务无法远程连接了。通过不同的客户端工具连接…

Java 数据结构之-LinkedHashMap

继承关系和基本概念 LinkedHashMap是HashMap的子类&#xff0c;它继承了HashMap的基本功能。它在HashMap的基础上&#xff0c;通过维护一个双向链表来记录元素的插入顺序或者访问顺序&#xff08;可以通过构造函数指定&#xff09;&#xff0c;从而在遍历元素时能够按照特定的顺…