【Node技巧】Node.js创建REST架构风格的API

news2024/11/5 23:41:17

node


🧑‍💼 一名茫茫大海中沉浮的小小程序员🍬
👉 你的一键四连 (关注 点赞+收藏+评论)是我更新的最大动力❤️!


📑 目录

  • 🔽 前言
  • 1️⃣ 什么是REST API?
  • 2️⃣ Node.js构建REST API的优势
  • 3️⃣ 准备工作:安装Node.js与Express
  • 4️⃣ 构建API的基础架构
  • 5️⃣ 创建CRUD接口
  • 6️⃣ API请求和响应的最佳实践
  • 7️⃣ 中间件的使用
  • 8️⃣ 错误处理和日志记录
  • 9️⃣ 数据验证和安全
  • 10. 实现用户身份验证和授权
  • 11. 实现分页与过滤
  • 12. 性能优化建议
  • 13. API文档的生成
  • 14. 将API部署到生产环境
  • 🔼 结语


🔽 前言

在现代Web开发中,创建高效的REST API至关重要。Node.js因其高并发、异步处理的特点成为开发RESTful API的流行选择。本文将详细介绍如何利用Node.js和Express框架构建一个REST架构风格的API。我们会逐步介绍核心概念、代码示例、以及如何将API优化至生产环境。通过本文的学习,您将掌握创建健壮的、可扩展的REST API的技巧。

1️⃣ 什么是REST API?

REST(Representational State Transfer)是一种用于构建网络应用的架构风格。RESTful API是一种基于HTTP协议的接口风格,它强调无状态、客户端-服务器的分离,易于扩展与维护。通过RESTful API,客户端可通过HTTP请求对服务器资源进行增删查改操作。

2️⃣ Node.js构建REST API的优势

Node.js基于V8引擎,拥有高效的异步I/O处理能力,非常适合实时和高并发请求的API应用场景。通过Express框架,Node.js提供了简洁的API构建方式,使开发者可以快速搭建灵活且高性能的REST API。

3️⃣ 准备工作:安装Node.js与Express

  1. 首先,确保您已经安装了Node.js,可以在终端运行以下命令查看版本:

    node -v
    npm -v
    
  2. 然后,创建一个新的项目文件夹,并初始化Node.js项目:

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

    npm install express
    

4️⃣ 构建API的基础架构

在项目根目录创建一个index.js文件作为API的入口。我们将使用Express快速搭建一个基础的API结构:

const express = require('express');
const app = express();
const port = 3000;

app.use(express.json());

app.get('/', (req, res) => {
    res.send('Welcome to My REST API!');
});

app.listen(port, () => {
    console.log(`API server listening at http://localhost:${port}`);
});

5️⃣ 创建CRUD接口

CRUD(Create, Read, Update, Delete)操作是API的核心。假设我们要创建一个简单的“用户”管理API:

  1. 创建用户(POST请求)
  2. 获取所有用户(GET请求)
  3. 更新用户(PUT请求)
  4. 删除用户(DELETE请求)

index.js中加入以下代码:

const users = []; // 模拟用户数据

// 创建用户
app.post('/users', (req, res) => {
    const user = req.body;
    users.push(user);
    res.status(201).send(user);
});

// 获取所有用户
app.get('/users', (req, res) => {
    res.status(200).send(users);
});

// 更新用户
app.put('/users/:id', (req, res) => {
    const { id } = req.params;
    const index = users.findIndex(u => u.id === parseInt(id));
    if (index !== -1) {
        users[index] = req.body;
        res.status(200).send(users[index]);
    } else {
        res.status(404).send({ message: 'User not found' });
    }
});

// 删除用户
app.delete('/users/:id', (req, res) => {
    const { id } = req.params;
    const index = users.findIndex(u => u.id === parseInt(id));
    if (index !== -1) {
        users.splice(index, 1);
        res.status(204).send();
    } else {
        res.status(404).send({ message: 'User not found' });
    }
});

6️⃣ API请求和响应的最佳实践

设计API时应注意以下几点:

  • 规范的HTTP状态码:例如,201用于创建成功,404用于资源未找到。
  • 保持响应结构一致性:如统一返回JSON格式,便于客户端解析。
  • 分页和过滤:对于大量数据,应支持分页和筛选。

7️⃣ 中间件的使用

Express中间件可以帮助我们处理跨域请求、解析请求体等。添加CORS和日志中间件:

const cors = require('cors');
const morgan = require('morgan');

app.use(cors());
app.use(morgan('tiny'));

8️⃣ 错误处理和日志记录

为保持代码整洁,将错误处理和日志分开处理。定义一个错误处理中间件:

app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send({ message: 'Something broke!' });
});

9️⃣ 数据验证和安全

为保证数据完整性,推荐使用JoiValidator来验证请求数据格式:

const Joi = require('joi');

const userSchema = Joi.object({
    id: Joi.number().required(),
    name: Joi.string().min(3).required()
});

app.post('/users', (req, res) => {
    const { error } = userSchema.validate(req.body);
    if (error) return res.status(400).send(error.details[0].message);
    const user = req.body;
    users.push(user);
    res.status(201).send(user);
});

10. 实现用户身份验证和授权

在API中加入JWT(JSON Web Token)认证:

const jwt = require('jsonwebtoken');

const authenticateJWT = (req, res, next) => {
    const token = req.header('Authorization');
    if (!token) return res.status(401).send('Access Denied');
    try {
        const verified = jwt.verify(token, 'secretKey');
        req.user = verified;
        next();
    } catch (err) {
        res.status(400).send('Invalid Token');
    }
};

11. 实现分页与过滤

app.get('/users', (req, res) => {
    const { page = 1, limit = 10 } = req.query;
    const startIndex = (page - 1) * limit;
    const endIndex = page * limit;
    res.status(200).json(users.slice(startIndex, endIndex));
});

12. 性能优化建议

  • 启用Gzip压缩:减少响应体积。
  • 缓存策略:如Redis缓存重复请求。
  • 负载均衡:如使用Nginx进行负载均衡处理。

13. API文档的生成

生成API文档是确保团队沟通和维护的关键。使用Swagger自动生成API文档:

npm install swagger-jsdoc swagger-ui-express

14. 将API部署到生产环境

推荐使用PM2来管理生产环境的进程,结合Nginx实现反向代理:

npm install pm2 -g
pm2 start index.js

🔼 结语

通过本文的详细介绍,相信大家对如何使用Node.js创建REST风格的API已经有了清晰的理解。从基本架构设计、CRUD接口的实现,到错误处理、用户身份验证、性能优化等高级技巧,构建一个健壮且高效的API并不复杂,但却需要关注细节。希望这些实践技巧能帮助您在项目中更轻松地实现API功能,并为未来的Web开发打下坚实的基础 🌐。

随着项目规模的扩大,别忘了继续优化和完善API,保持高性能和安全性,使您的应用在实际环境中表现出色 💪。祝您在API开发的道路上不断进步,实现更高效、更可靠的Web服务!

博主的佚名程序员专栏正在持续更新中,关注博主订阅专栏学习前端不迷路!

如果本篇文章对你有所帮助,还请客官一件四连!❤️
img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2233904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js中怎么把excel和pdf文件转换成图片打包下载

index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>文件转图片工具</title><!-- 本…

Linux 练习三

1、建立用户组 shengcan&#xff0c;其id 为 2000 [rootlocalhost 桌面]# groupadd -g 2000 shengchan 2、建立用户组 caiwu&#xff0c;其id 为 2001 [rootlocalhost 桌面]# groupadd -g 2001 caiwu 3、建立用户组 jishu&#xff0c;其 id 为 2002 [rootlocalhost 桌面]#…

uniapp vue3 使用echarts-gl 绘画3d图表

我自己翻遍了网上&#xff0c;以及插件市场&#xff0c;其实并没有uniapp 上使用echarts-gl的样例&#xff0c;大多数都是使用插件市场的echarts的插件 开始自己尝试直接用echartsgl 没有成功&#xff0c;后来尝试使用threejs 但是也遇到一些问题&#xff0c;最后我看官网的时…

openGauss数据库-头歌实验1-4 数据库及表的创建

一、创建数据库 &#xff08;一&#xff09;任务描述 本关任务&#xff1a;创建指定数据库。 &#xff08;二&#xff09;相关知识 数据库其实就是可以存放大量数据的仓库&#xff0c;学习数据库我们就从创建一个数据库开始吧。 为了完成本关任务&#xff0c;你需要掌握&a…

Android TextView自动换行文本显示不全解决

某些情况下&#xff0c;TextView自动换行后&#xff0c;会出现每行结尾处显示不全的问题&#xff0c; 如图&#xff1a; 常见解决方案&#xff1a; 设置TextView的“ellipsize”属性为“end” 实测无效&#xff01;将TextView外部的Layout改为RelativeLayout 实测无效&…

华为 HarmonyOS NEXT 原生应用开发: 动画的基础使用(属性、显示、专场)动画

2024年11月5日 LiuJinTao 文章目录 鸿蒙中动画的使用一、属性动画 - animation属性动画代码示例 二、显示动画 - AnimateTo三、专场动画 鸿蒙中动画的使用 一、属性动画 - animation 属性动画代码示例 /*** 属性动画的演示*/ Entry Component struct Index {State selfWidth:…

信号与噪声分析——第三节:随机过程的统计特征

随机过程的定义&#xff1a; 随机过程是一种数学模型&#xff0c;用来描述系统或现象在时间或者空间上随之变化的不确定性。 一个随机过程的数字特征 1.数学期望&#xff08;统计平均值&#xff09;&#xff1a; 表示为 数学期望是随机过程在时间 t 上的平均值&#xff0c;通常…

Linux SSH免密登入以及配置脚本

一、ssh原理简单介绍 客户端生成一对公钥和私钥&#xff0c;并将自己的公钥发送到服务器上 其中公钥用来加密&#xff0c;私钥用来解密。 二、ssh免密登入实现步骤详解 我这就以服务器controller和客户端compute来做为例子 2.1、首先在controller上输入ssh-keygen -t rsa …

搜维尔科技:Manus VR数据手套-机器人手部数据采集,推动机器人技术新高度

人工智能机器人培训-构建集成 将实时数据直接传输到ROS并开始控制你的机器人。使用我们的 C Windows 和Linux SDK开发集成&#xff0c;以用于自定义管道。 原始数据&#xff1a;推动机器学习和机器人技术 以CSV格式记录并导出手指运动作为原始数据。为机器学习和机器人应用提…

将HTML项目上传至Gitee仓库(详细教程)

1.登录giett giett地址链接:Gitee - 基于 Git 的代码托管和研发协作平台 2.新建一个giett仓库 创建后得到远程仓库&#xff1a; 3、在本地项目文件夹右击鼠标点击 Open Git Bash Here 4、输入命令 命令:git init&#xff0c;这个目录变成git可以管理的仓库&#xff0c;会出…

重大917该如何复习?难度大不大?重点是啥?

C哥专业提供——计软考研院校选择分析专业课备考指南规划 重大917整体难度不高&#xff0c;认真研究好各年真题&#xff0c;经过系统扎实的复习&#xff0c;相信同学一定能取得好的成绩&#xff01; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 重庆…

CentOS 7 安装 ntp,自动校准系统时间

1、安装 ntp yum install ntp 安装好后&#xff0c;ntp 会自动注册成为服务&#xff0c;服务名称为 ntpd 2、查看当前 ntpd 服务的状态 systemctl status ntpd 3、启动 ntpd 服务、查看 ntpd 服务的状态 systemctl start ntpdsystemctl status ntpd 4、设置 ntpd 服务开机启…

信息安全工程师(77)常见网络安全应急事件场景与处理流程

前言 网络安全应急事件场景多样&#xff0c;处理流程也需根据具体情况灵活调整。以下将详述几种常见的网络安全应急事件场景及其处理流程。 一、数据泄露事件 场景描述&#xff1a; 数据泄露是指敏感、受保护或机密数据被未经授权的个人复制、传输、查看、窃取或使用。这种事件…

使用Django REST framework构建RESTful API

使用Django REST framework构建RESTful API Django REST framework简介 安装Django REST framework 创建Django项目 创建Django应用 配置Django项目 创建模型 迁移数据库 创建序列化器 创建视图 配置URL 配置全局URL 配置认证和权限 测试API 使用Postman测试API 分页 过滤和排序…

【保姆级教程】使用 oh-my-posh 和 clink 打造个性化 PowerShell 和 CMD

内容预览 ≧∀≦ゞ 终端美化指南—— oh-my-posh 和 clink 篇引言一、准备工作默认终端&#xff1a;Windows Terminal离线安装步骤 包管理器&#xff1a;scoop为什么选择使用 Scoop 安装&#xff1f;scoop 安装 字体下载 二、配置 Windows Terminal三、配置 oh-my-posh安装激活…

「Mac畅玩鸿蒙与硬件17」鸿蒙UI组件篇7 - Animation 组件基础

在应用开发中&#xff0c;动画效果可以增强用户体验。鸿蒙框架提供了 translate、scale 和 rotate 等动画功能&#xff0c;允许对组件进行平移、缩放和旋转等操作。本篇将介绍 Animation 组件的基础知识和示例代码。 关键词 Animation 组件动画效果位置动画自动动画缩放动画 一…

编写第一个 Appium 测试脚本:从安装到运行!

前言 最近接到一个测试项目&#xff0c;简单描述一下&#xff0c;需求就是&#xff1a;一端发送指令&#xff0c;另一端接受指令并处理指令。大概看了看有上百条指令&#xff0c;点点点岂不是废了&#xff0c;而且后期迭代&#xff0c;每次都需要点点点&#xff0c;想想就头大…

vue 使用docx-preview 预览替换文档内的特定变量

在开发合同管理中&#xff0c;需要使用到此功能&#xff0c;就是替换合同模板内的一些字符串&#xff0c;如&#xff1a;甲乙方名称&#xff0c;金额日期等&#xff0c;合同内容不变。效果如下&#xff1a; 使用docx-preview 好处是只预览不可编辑内容。 前端vue import { re…

部署istio应用未能产生Envoy sidecar代理

1. 问题描述及原因分析 在部署Prometheus、Grafana、Zipkin、Kiali监控度量Istio的第2.2章节&#xff0c;部署nginx应用&#xff0c;创建的pod并没有产生Envoy sidecar代理&#xff0c;仅有一个应用容器运行中 故在随后的prometheus中也没有产生指标istio_requests_total。通…

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…