news 2026/4/16 12:45:48

Next.js 的 API 路由文件(route.ts)的核心拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Next.js 的 API 路由文件(route.ts)的核心拆解

D:\trea\ployment\project24\Foresight-beta\apps\web\src\app\api\email-otp\request\route.ts

这是一个 Next.js 的 API 路由文件 ,用于处理 发送邮箱验证码 的请求。

它是后端逻辑的一部分,主要用于 绑定邮箱到钱包地址 时的身份验证。

1. 这个文件做什么?怎么做的?


- 做什么 :接收前端发来的“发送验证码”请求(包含邮箱和钱包地址),生成一个 6 位数字验证码,通过 SMTP 邮件服务发送给用户,并将验证码临时存储在服务器内存中以便后续验证。
- 怎么做的 :
1. 身份核验 :检查请求者的 Session(Cookie)是否与请求中的钱包地址一致,防止冒充。
2. 生成与存储 :生成随机 6 位数,存入全局内存对象( globalThis ,通过 getEmailOtpShared 获取),设置 15 分钟有效期。
3. 邮件发送 :使用 nodemailer 库连接配置好的 SMTP 服务器(如 Gmail, Outlook 等)发送邮件。
4. 开发环境后门 :如果是开发环境且邮件发送失败,它会直接把验证码返回给前端(方便调试)。

2. 核心功能


1. 安全性检查 : getSessionAddress(req) 确保发起请求的用户确实拥有该钱包地址的会话。
2. 防刷/限流 :检查 rec.lockUntil ,如果用户请求太频繁会被锁定(返回 429)。
3. 验证码生命周期管理 :生成、存储、过期时间(15分钟)。
4. 邮件发送服务 :封装 SMTP 发送逻辑。

3. 怎么找?(关联文件位置)


- 前端调用(Frontend) :

- 位置: apps/web/src/components/WalletModal.tsx (约 329 行)
- 代码特征: fetch('/api/email-otp/request', ...)
- 注意:项目中有两套验证码逻辑, LoginModal 用的是 Supabase,而这个 API 是自定义的,主要在 WalletModal 中使用。
- 共享工具/存储(Shared Utils) :

- 位置: apps/web/src/lib/serverUtils.ts
- 内容:定义了内存存储结构 ( getEmailOtpShared ) 和 Session 解析逻辑。
- 配置文件(Config) :

- 位置:项目根目录 .env 文件
- 关键词: SMTP_HOST , SMTP_PORT , SMTP_USER , SMTP_PASS 。

4. 梳理执行逻辑


输入 :POST 请求,Body JSON { email: "...", walletAddress: "..." }

流程图解 :

1. 初始化

- 获取全局共享存储 store 和日志 logs 。
- 解析 Body 获取 email 和 walletAddress 。
2. 前置校验 (Validation)

- Cookie 校验 :从 Cookie 解析 fs_session ,对比其地址与 Body 中的 walletAddress 是否一致。不一致 $\rightarrow$ 401 Unauthorized 。
- 格式校验 :检查邮箱格式。错误 $\rightarrow$ 400 Bad Request 。
3. 状态检查 (State Check)

- 从 store 获取该邮箱的记录。
- 锁定检查 :如果当前时间 < lockUntil ,说明被锁定。 $\rightarrow$ 429 Too Many Requests 。
4. 生成与更新 (Update)

- 生成 6 位随机码 genCode() 。
- 更新内存记录:设置 code , expiresAt (当前时间+15分钟),记录发送时间。
- 写入 store 。
5. 发送邮件 (IO Action)

- 记录日志 status: 'queued' 。
- 调用 sendMailSMTP 。
- 成功 :记录日志 status: 'sent' $\rightarrow$ 返回 200 OK { success: true } 。
- 失败 (Exception) :
- 记录错误日志。
- 开发环境特权 :如果 NODE_ENV !== 'production' ,返回 200 OK 但附带 codePreview (直接把验证码告诉你)。
- 生产环境 :返回 500 Internal Server Error 。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 20:59:46

python-flask-django交通事故档案管理平台的设计与实现_o63l5u1o

文章目录系统截图项目技术简介可行性分析主要运用技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统截图 pythonpython-flask-django_o63l5u1o 交通事故档案管理平台的设计与实现-flask-django_陈丽英…

作者头像 李华
网站建设 2026/4/16 9:09:26

vue和springboot框架开发的小程序 高校社团活动报名管理系统_2d68m1o7

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 同行可拿货,招校园代理 vueSpringboot高校社团活动报名管理系统_2d68m1o7 框架…

作者头像 李华
网站建设 2026/4/15 9:51:57

【大牛抄底】副图+选股指标抄底 逃顶 聚宝盆

{} Y1: -2; B: 99; T: 79; X1:25; VAR1:REF(CLOSE,1); 标尺: SMA(MAX(CLOSE-VAR1,0),5,1)/SMA(ABS(CLOSE-VAR1),5,1)*100,COLORYELLOW; VAR2:(CLOSE-LLV(LOW,18))/(HHV(HIGH,18)-LLV(LOW,18))*100; VAR3:SMA(VAR2,5,1); VAR4:SMA(VAR3,3,1); VAR5:SMA(VAR4,3,1); 浪:…

作者头像 李华
网站建设 2026/4/16 9:09:06

2025年热门低代码/零代码开发平台

工业自动化领域正经历一场开发范式革命&#xff0c;传统的手写代码模式逐渐被可视化拖拽和模块化组装的低代码/零代码平台取代。这些平台显著降低开发门槛&#xff0c;提升工程效率&#xff0c;成为推动智能制造落地的关键工具。本文将深入解析国产新锐GraniStudio零代码平台的…

作者头像 李华
网站建设 2026/4/16 9:07:18

自学黑客走网络安全路?不是我泼冷水,普通人真的别硬扛!

自学黑客&#xff08;网络安全&#xff09;&#xff0c;一般人我劝你还是算了吧&#xff01; PART.01 自学网络安全的误区和陷阱 1.不要试图先成为一名程序员&#xff08;以编程为基础的学习&#xff09;再开始学习 一再强调不要以编程为基础再开始学习网络安全&#xff0c;…

作者头像 李华