- 博客(445)
- 资源 (11)
- 问答 (1)
- 收藏
- 关注
原创 成为全栈·Node 后端篇·辅助接口:相邻、相关、目录、统计与搜索
上一篇、相关文章、目录、统计这些辅助接口最容易被"顺手加"成各自为政。本文讲它们如何薄路由落地:按发布时间定上一篇 / 下一篇、用"共享标签 + 同分类"给相关文章打分并附演算示例、parseToc 纯函数生成目录,并展示公开可见性铁律如何贯穿所有读接口。
2026-09-12 12:28:15
412
原创 成为全栈·Node 后端篇·评论内容安全:敏感词过滤、三态审核与级联删除
评论区既要留得住人,也要控得住风险。本文讲评论安全的三件套:敏感词命中转等长星号并按违规比率定审核态、approved / reviewing / rejected 三态审核流让 reviewing 做人工兜底、公开列表只吐 approved;删除父评论时如何级联子回复,以及过滤为何必须放在服务端。
2026-09-12 12:22:24
329
原创 成为全栈·Node 后端篇·阅读量防刷:去重、冷却与计数写分离
阅读量若每次调用就 +1,很快会变成自欺欺人的数字。本文讲真实实现的三件套:用"时间桶"做去重与 24 小时冷却、去重与计数分开写避免主表行锁竞争、唯一约束兜住并发;也如实交代匿名身份下去重只是尽力而为,且阅读量只统计已发布文章。
2026-09-11 11:21:25
261
原创 成为全栈·Node 后端篇·分类树:无限级分类的存储、查询与环检测
无限级分类的存储、查询与环检测:用 parentId 自关联存层级(以及为何刻意不声明外键引用)、取全量在内存里组装成树、深度四级封顶防失控、环检测防止把节点挂到自己的子孙下、删除守卫 x-cascade:none,外加各分类已发布文章计数与面包屑回溯的实现。
2026-09-11 11:16:52
380
原创 成为全栈·Node 后端篇·一套后端双部署:适配层如何让一份代码跑在两套运行时
项目里为什么有两个入口?本文讲"一套代码双部署"的适配层设计:Drizzle 的 SQLite dialect 统一两端、setDb / getDb 注入模式把数据库实例化摁在边界、两个入口复用同一个 createApp、app.ts 绝不在顶层创建默认实例——让同一份业务代码在自管 Node 与 Cloudflare Workers 两套运行时上各自跑起来。
2026-09-10 11:09:10
383
原创 成为全栈·Node 后端篇·部署上线:从本地起服到真正对外服务
本地起服与"用户能从公网访问"之间,隔着一串环境变量、数据库迁移、HTTPS、CORS 与进程守护。本文对照真实代码讲两条部署路线(自管 Linux 与 Cloudflare Workers)、环境变量这个真正的"旋钮"、STORAGE_DRIVER 存储开关与 CORS 生产配置,并附一张症状 → 根因 → 代码依据的翻车对照表。
2026-09-10 10:52:53
234
原创 成为全栈·Node 后端篇·容器化:给 Node 应用写一个像样的 Dockerfile
容器化是把"环境"也变成代码的一部分。本文为项目写一份像样的 Dockerfile:先看清要装进去的产物,再讲多阶段构建如何只把运行产物带进镜像、基础镜像与 Node 版本怎么选、.dockerignore 怎么挡脏文件、为什么必须非 root 运行,以及首次部署前那两个不能忘的动作:migrate 与 seed。
2026-09-09 10:11:18
201
原创 成为全栈·Node 后端篇·后端测试策略:单元、集成与测试数据库
测试全绿不等于没缺陷,关键在测得对不对。本文讲后端测试策略:不引 supertest 也能用 app.request 发真实请求、测试库用 :memory: + beforeEach 做到互不污染、门禁全绿但错误码与契约不一致的真实教训,以及补测试要专打边界与并发、ESM 与脚本门禁的坑。
2026-09-09 10:08:48
268
原创 成为全栈·Node 后端篇·接口文档自动化:让 OpenAPI 与代码不脱节
文档与代码是两份东西,只要存在两份,迟早会漂移。本文讲更彻底的解法:让 OpenAPI 契约为唯一事实源,用"结构门 + 语义门"两道机器校验把代码与契约焊死;并以真实踩坑说明信封格式冲突、注释与 README 数字这类沉默技术债如何随契约一并治理。
2026-09-08 10:47:48
203
原创 成为全栈·Node 后端篇·全文搜索:从 LIKE 到全文索引
搜索框人人会写,但 LIKE '%词%' 的真实代价常被低估:前导 % 走不了索引、没有相关性排序、中文分词直接失灵。本文帮你判断自己的场景停在哪一段——先用 LIKE 跑起来、用 SCAN_LIMIT 封顶,再谈什么时候才值得上 Meilisearch / Elasticsearch 这类专用引擎。
2026-09-08 10:46:18
723
原创 成为全栈·Node 后端篇·文件上传:R2 / 本地磁盘双实现与签名直传
文件上传看着只有三步,坑全在"收下之后"。本文讲用一层存储适配层同时伺候 Cloudflare R2 与本地磁盘:以 SHA-256 内容寻址让同一份文件不重复落盘,在信任边界做大小与类型校验,防路径遍历与 SVG 的 XSS,删除时靠引用计数护栏决定物理文件去留。
2026-09-07 10:38:14
631
原创 成为全栈·Node 后端篇·文章 CRUD 与投稿状态机
本文讲内容站文章 CRUD 与投稿状态机的落地。先用 draft / pending / published 三态把"谁能直接发、谁发完要审"说清,再讲 member 不可自发布的领域规则如何写进 service,随后走一遍薄路由的 CRUD 端点,以及软删除、slug 部分唯一、标签同步这三个一不留神就漏的坑。
2026-09-07 10:33:34
500
原创 成为全栈·Node 后端篇·列表接口三件套:分页、筛选、排序
列表接口三件套的工程化做法:分页用 offset + 稳定键保证不重不漏;筛选用白名单 DSL,让用户永远拼不出 SQL;排序用带符号字段名并限定基表列,避开连表后的 ambiguous column 报错;再用 SCAN_LIMIT 给 LIKE 全表扫描装一个刹车。
2026-09-06 11:21:06
429
原创 成为全栈·Node 后端篇·分类与标签:多对多关系的建模与查询
围绕"一篇文章挂多个标签、一个标签下躺着几百篇文章"的建模问题,讲多对多关系为什么用中间表存、列表查询怎么避开 N+1、"某标签下有多少篇文章"如何精确统计(而不是靠 JSON 子串匹配),以及删除时"引用存在即拒"的守卫和写入入口唯一的原则。
2026-09-06 11:14:57
447
原创 成为全栈·Node 后端篇·权限模型:从认证到 RBAC
本文区分了认证与授权两个不同概念,基于 RBAC 搭建三层权限模型,划分 member、editor、admin 三种角色,严格划定编辑仅可管理内容、管理员管控用户与站点配置的权限边界。项目以 guard 函数作为授权判断的核心原语,同时支持角色阶梯放行与资源归属放行两套规则;并且严格区分资源不存在返回 404、无访问权限返回 403,避免攻击者遍历探测资源。系统增设两道安全护栏,禁止管理员修改自身角色状态,同时保留至少一名活跃管理员,防止出现无最高权限账号的死锁困境。另外文章提及删除资源前需要校验外部引用
2026-09-05 10:32:02
396
原创 成为全栈·Node 后端篇·注册登录全流程实现
本篇文章完整落地 Node 后端注册、登录、令牌刷新、登出整套认证链路。密码采用 bcryptjs 慢哈希加密存储,杜绝明文入库,纯 JS 实现适配本地与 Cloudflare 双部署环境。注册接口强制新用户角色为普通会员,搭配前置查重与唯一约束异常捕获,抵御并发重复注册问题。登录接口统一返回相同错误码,避免攻击者枚举探测账号。登录成功后签发双令牌:一小时有效期无状态 JWT 访问令牌,以及存入数据库、支持旋转吊销的有状态刷新令牌,刷新令牌存放于 HttpOnly Cookie 提升安全性。登出时直接删除刷
2026-09-05 10:30:04
434
原创 成为全栈·Node 后端篇·认证方案:JWT 还是 Session
本文对比后端两大主流认证方案 JWT 与 Session,Session 会话状态保存在服务端,令牌吊销简单,但水平扩展不便;JWT 属于无状态令牌,适合边缘、Serverless 部署,却存在令牌签发后难以提前作废的短板。项目最终采用折中方案:短期 1 小时有效期的 JWT 作为访问令牌实现无状态鉴权,刷新令牌存入数据库表做有状态管理,支持随时吊销、登出作废。将用户角色存入 JWT 载荷可以免去每次鉴权查询数据库,但是角色更新存在短暂延迟,需要权衡取舍。同时将 401 认证失败场景拆解为 5 种细分业务码
2026-09-04 10:41:05
775
原创 成为全栈·Node 后端篇·结构化日志与请求链路追踪
本文讲解 Node 后端结构化日志与请求链路追踪的建设思路。普通 console.log 难以满足线上排查问题的需求,核心解决方案是为每一次请求生成唯一 requestId 充当 traceId,让整条请求链路的所有日志都携带该标识,故障排查时便可一键还原完整执行轨迹。文章介绍 debug、info、warn、error 四级日志分级管理策略,以此控制生产环境日志噪音。结构化 JSON 日志能够实现日志检索与数据聚合统计,远优于拼接式字符串日志。同时提出日志落盘存储、敏感信息脱敏、日志字段命名与项目契约保持
2026-09-04 10:37:43
363
原创 成为全栈·Node 后端篇·参数校验:为什么必须在最外层做
# 成为全栈·Node 后端篇·参数校验:为什么必须在最外层做从前端转后端的同学,最常带过来的一个误区是:"校验不就是表单那边 `required`、正则匹配一下吗?我前端都验过了,后端还要再验?"要命就在这句话上。前端校验是为了**用户体验**——你输错邮箱,页面立刻红字提示,不用等请求往返。但前端校验**绝对不等于安全**。任何人都可以打开浏览器 DevTools,绕过你的 JS,直接发一个构造好的恶意请求。如果你的后端也"信任"前端传来的数据,那等于把家门钥匙挂在"请随手关门"的提示牌上。举个具
2026-09-03 10:37:13
259
原创 成为全栈·Node 后端篇·错误处理:异常分层与全局捕获
本文讲解Node后端分层异常与全局捕获方案,将错误划分为业务异常、校验异常、未知异常三类。搭建全局错误中间件,让所有异常最终收敛至统一响应信封,无需在每个接口编写try‑catch。采用常量对象管理错误码,借助类型检查提前发现拼写错误。作者结合项目实战总结教训:自动化门禁校验通过不代表语义符合契约,需额外编写契约比对脚本。针对用户名唯一这类并发场景,摒弃先查后插写法,通过捕获数据库唯一约束冲突转换为业务错误。同时定下生产环境安全规则,未知异常堆栈仅留存服务日志,绝不向外泄露给前端。
2026-09-03 10:35:48
297
原创 成为全栈·Node 后端篇·统一响应结构:HTTP 状态码与业务码如何分工
本文介绍 Node 后端接口统一响应信封方案,制定包含code、message、data、requestId、timestamp五字段的返回契约,一套格式适配所有成功、失败与分页列表接口。文章厘清 HTTP 状态码与业务码的分工,HTTP 码供网关、浏览器识别传输状态,业务码交由前端细化处理业务场景。项目采用原生 Response 构造响应,解除 Hono 框架依赖,适配 Node 与 Cloudflare 双部署,同时建立业务码‑HTTP 码集中映射表,通过类型校验防止错误码遗漏。并结合实战案例说明,当代
2026-09-02 09:36:08
263
原创 成为全栈·Node 后端篇·配置管理:环境变量、多环境与密钥安全
本文讲解 Node 后端分层配置与密钥安全工程方案。采用三层配置优先级:代码默认兜底、环境变量覆盖、平台运行时注入,实现一套代码适配多环境。规范 .env 存真实密钥不入库、.env.example 作为公开配置模板,杜绝密钥硬编码与提交泄露。针对 Node/Cloudflare 双部署割裂问题,通过环境单例封装统一读取配置,摒弃框架专属 c.env,保证两端代码一致。同时预置管理员种子环境变量,解决项目初始化无超级管理员的死锁问题,从配置层面保障项目安全、可复现、可无缝环境切换。
2026-09-02 09:32:03
446
原创 成为全栈·Node 后端篇·数据迁移:schema 变更如何不弄脏线上数据
本文聚焦 Node 后端项目的数据迁移方案,讲解线上修改数据表结构的安全实践。文章首先剖析手动执行 ALTER TABLE 改动线上库带来不可追溯、无法复现等多重风险,提出所有结构变更都应写成版本化迁移脚本。结合项目本地环境与 Cloudflare D1 双部署的架构,设计两套差异化迁移路径:本地开发使用内联语句数组循环执行,依靠IF NOT EXISTS实现幂等重置;生产环境借助 drizzle‑kit 生成迁移文件,于部署流水线执行,两条路径同源共用一份 schema 定义。同时点明 better‑sq
2026-09-01 10:38:20
320
原创 成为全栈·Node 后端篇·ORM 为什么选 Drizzle:类型安全与 D1 适配
本文讲解 Node 后端 ORM 选型决策,对比手写 SQL 与 ORM 的差异,分析 Prisma、TypeORM 的不足,最终选定 Drizzle 作为项目 ORM 方案。Drizzle 采用 TypeScript 定义 Schema,无需独立生成步骤,运行时轻量,语法贴近原生 SQL,对 Cloudflare D1 支持良好,适配项目本地 SQLite 与 Cloudflare D1 双部署需求,同一份 Schema 定义可同时用于建表、类型安全查询与双环境运行,避免字段不匹配问题。
2026-09-01 10:33:11
250
原创 成为全栈·Node 后端篇·数据库选型:关系型还是文档型
本文围绕Node后端数据库选型展开对比,剖析关系型数据库与文档型数据库的差异,结合专栏网站关联密集、强一致性、多跨表聚合统计的业务特征,最终选定关系型方案。为达成一份代码同时部署至Linux服务器与Cloudflare D1的目标,项目采用SQLite语义,本地选用better‑sqlite3规避Node实验模块不稳定风险。通过封装`getDb()`数据库适配层,将本地SQLite与D1之间的类型转换收口于单一文件,业务代码无需感知底层驱动差异。同时指出SQLite外键约束默认关闭的隐患,相关校验逻辑交由应
2026-08-31 11:08:39
388
原创 成为全栈·Node 后端篇·分层架构:Controller、Service、Repository 的边界
本文基于Hono+TypeScript后端实战,讲解Controller‑Service‑Repository分层架构,解决项目迭代后期代码臃肿混乱的问题。作者结合十年前端开发经验,对照前端分层思维,给出一套七目录后端工程结构,并明确各层职责边界:routes作为薄控制器仅承担鉴权、参数校验、调用服务、封装响应,禁止直接访问数据库;services存放全部业务规则、状态流转、数据读写逻辑,是数据库访问的唯一入口;shared放置无业务耦合的基础设施代码,尽量做到零框架依赖;types只存放类型定义,以此规避
2026-08-31 11:04:03
495
原创 成为全栈·Node 后端篇·框架选型:Express、Koa、Fastify、NestJS 的差异与为何选 Hono
框架选型是后端工程的第一道岔路口。很多教程一上来就说"我们用 Express"或者"我们用 NestJS",却很少讲**为什么**。我更想带你从"我们这个工程到底被什么约束"出发,反推出答案——因为选型从来不是给框架排名,是给约束找最合身的那一个。
2026-08-30 11:11:43
442
原创 成为全栈·Node 后端篇·后端工程从零搭建:TypeScript、目录与热更新
上一篇产品篇里,我把「一个真实的多端文章系统」摊开给你看:七个子项目、一份共享 API 契约、一条共同的版本历史。从这一篇起,我们要钻进其中一个子项目——Node 后端,把它从 `git init` 之后的一张白纸,搭成能跑、能测、能部署的工程。我会用三十一篇讲完它。而所有故事,都从今天这个最朴素的问题开始:一个后端工程,初始化时到底该长什么样?
2026-08-30 11:05:26
337
原创 成为全栈·产品篇·全栈能力地图:你读完这套会拥有什么
在动手之前,先把「终点」亮给你看。这是一张「前端 → 全栈」的能力清单,配上自评标尺。读 [为什么前端工程师要走向全栈](https://blog.csdn.net/fungleo/article/details/164119914) 后紧接这篇,你会清楚整套专栏要把你带到哪;读到 M8 收官时,再回看这张地图逐格打勾。
2026-08-29 11:11:54
632
原创 成为全栈·产品篇·本系列怎么读:主线、支线与学习路径
M0 八篇到这里收尾。这篇给你一张阅读地图——两套编号(主线 M0–M8 / 支线 B)怎么排、两类读者(有前端基础 / 零基础)分别怎么走、以及面对 130 篇的规模该怎么不慌。读完后,你就知道从哪一页开始翻了。
2026-08-29 11:03:04
263
原创 成为全栈·产品篇·工程公约:git tag、仓库组织与 CSDN 发布流程
前面几篇讲了「做什么」——七端、建模、契约。这篇讲「怎么把这一切组织起来,让它能复现」。一套专栏最大的承诺是「读者跟着做能跑起来」,而让这个承诺成立的东西,就是工程公约:monorepo 单仓、里程碑式 git tag、一份 `ARTICLES.md` 对照表、以及 CSDN 发布流程。
2026-08-29 10:53:53
403
原创 成为全栈·产品篇·契约先行:设计一套被七个端复用的 API
实体定好之后,下一步是把它们「暴露」成接口。我会讲清什么是 Contract-First(契约先行)、统一响应怎么设计、错误码为什么分两层、版本化怎么玩,以及为什么这份契约值得用机器去校验。读完你会明白,为什么 [用一个真实系统串起全栈]) 说它是「唯一硬地基」。
2026-08-28 10:34:51
488
原创 成为全栈·产品篇·领域建模:一个文章系统有哪些实体、什么关系
带你做一件当纯前端时几乎从没做过的事——**为数据「建模」,而不是「渲染」**。我会用本系列这个真实文章系统作案例,把核心实体和它们的关系拆给你看,并讲清几个「不对这意味着什么」的建模决策。读完你会明白,为什么说「设计是常量」,而实体关系就是那个不变量。
2026-08-28 10:26:27
305
原创 成为全栈·产品篇·技术选型不是投票
拆清楚这套专栏每个端的技术栈是怎么定的,尤其要把后端栈(Hono + Drizzle + Cloudflare D1/R2)为什么「已经定死」讲透。更重要的是,把背后的**选型方法论**交给你——这套方法能迁移到你自己的任何项目,比记住某个框架名字值钱。
2026-08-27 17:11:40
409
原创 成为全栈·产品篇·用一个真实系统串起全栈
给你看清楚这套专栏的「载体」到底是什么——一个真实可运行的多端文章系统,由七个子项目组成。我会把七个子项目逐一亮出来,并回答两个关键问题:为什么是「一个系统七端」而不是七个独立教程?为什么我们一波一波做、不一起上?
2026-08-27 16:47:03
263
原创 成为全栈·产品篇·为什么前端工程师要走向全栈:边界、价值与代价
说清一件事——前端工程师走向全栈,到底扩展了什么能力、值不值得、以及哪类人其实不必转。读完后你会知道,这套专栏打算怎么把你从「调接口的人」托到「设计系统的人」。
2026-08-27 16:23:57
547
原创 React 移动端实战 · 前端报错了先别甩锅后端:一套请求链路分层定位法,少走三天弯路
本文提出一套请求链路分层故障定位方案,解决前端报错就先怀疑后端的惯性思维。完整链路从前到后分为前端渲染状态、前端请求校验、代理网关、后端服务、数据库五层,每层都给出对应的验证手段,排查应当由上游至下游逐步自证清白,依靠实际证据锁定故障层级。文章列举三个实战案例:列表显示暂无数据根源是数据库关联字段为空;分享功能接口返回成功,却因前端缺失字段校验判定失败;后台配置生效但前端提示不可用,由前端完整性校验规则过于严苛引发。文中整理出标准化排查操作清单与实战坑点对照表,同时结合过往代理透传、fail‑closed拦
2026-08-26 11:13:56
430
原创 React 移动端实战 · 接口一直 503,后端却说没挂?聊聊中间件的 fail-closed 设计取舍
本文基于一次联调实战案例,剖析后端服务运行正常、接口却持续返回503的问题根源,引出服务中间件fail‑closed故障关闭设计理念,对比fail‑open故障开放方案的差异。本次故障由两道中间件校验触发:产品认证策略、品牌配置数据缺失时,服务主动拒绝请求返回503,以此规避脏数据、越权等风险。文章分析该设计带来的代价,本地开发缺少初始化种子数据便无法通过校验,并且明确用户端只读、管理端写入配置的职责边界。同时给出一套从前端、代理、后端直至数据库的分层排查流程,整理多项实战踩坑经验,最后总结fail‑clo
2026-08-26 10:40:29
455
原创 React 移动端实战 · 本地开发要对接两个后端,我为什么不用 nginx、不引 http-proxy,偏要手撸零依赖 Node 反代?
本文介绍Next.js本地开发环境下,不使用Nginx与第三方代理库,基于Node内置模块手写零依赖反向代理的实践。项目存在用户端、管理端两套后端服务,生产依靠Nginx网关分流,本地复刻相同路由逻辑,设置独立代理端口作为统一请求入口,前端无需修改业务代码。代理按照请求方法与URL路径完成流量分发,处理各类请求头透传,单独实现WebSocket升级事件转发,并提供健康检查接口便于排错。文章梳理端口冲突、Host头改写、WebSocket断开等实战踩坑点,给出可直接运行的完整代码骨架。该方案规避跨平台工具差异
2026-08-25 10:41:46
493
原创 React 移动端实战 · Next.js 14→16 大版本升级:一份代码级破坏性盘点与两段式落地复盘
本文复盘 Next.js14 升级至 16、同步升级 React19 的实战过程,项目采用两段式升级策略,先升级至 15.5.23 安全补丁版本,再过渡到 16.3.2。升级前通过全局检索盘点项目特性,规避中间件、Server Actions 等高风险模块,核心代码变更为适配 Next15 将 params、searchParams 改为 Promise,对多处路由页面及单元测试做异步改造。React19 迁移以类型更新为主,业务逻辑改动较少。同时独立处理 ESLint9 扁平化配置迁移,解决 React
2026-08-25 10:12:58
447
黑苹果USB无线网卡驱动,适用于mac10.15.x的版本,祝大家好用!
2020-08-04
win10系统iis伪静态配置安装文件64位版
2015-12-17
黑苹果 Clover 引导编辑器 Mac 版本
2020-05-03
Sip 软件免费版,MacOS 下好用的屏幕取色软件
2020-05-03
文本替换专家2.5(无需注册版|非破解)
2015-11-24
让黑苹果系统,支持安卓手机分享USB网络 HoRNDIS-9.2
2020-09-01
用于 MAC上卸载 Creative Cloud 的工具
2017-02-27
FengFocus jQuery焦点图插件
2015-09-04
Sublime Text 3/64 精心调配版 by FungLeo
2015-08-26
移动端css文字使用什么单位最合适?
2015-08-26
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅