william.chan's blog

done is better than perfect

nodejs + sharp 压缩图片和GIF

实现压缩图片的命令行工具,并提供 mac zsh 配置

在日常开发和写博客时,我们经常需要压缩图片或者将图片转换为 webp 等高效格式,以加快网页的加载速度。虽然有很多在线压缩网站,但每次都去访问、上传、下载未免太繁琐。 借助于 Node.js 中性能极高的 sharp 库,我们可以自己动手写一个简单的命令行脚本程序,再配合 macOS 的 zsh 别名配置,实现在终端里一行命令秒压图片的极客开发体验。 为什么选择 Sharp? 在 ...

nestjs 短链服务

生成方案对比与核心代码实现

在营销短信、社交媒体分享以及二维码生成等场景中,经常需要将冗长的 URL 转换成简短的链接(类似于 t.cn/xxxx 或 bit.ly/xxxx)。这不仅能缩减字符数量,使得排版更加美观,还能通过短链服务器进行访问量(PV/UV)的埋点统计。 本文将深入探讨在 NestJS 中实现短链服务的几种主流方案,对比它们的优缺点,并提供最佳实践的代码实现。 短链服务的三大核心方案对比 短链的...

nestjs EventEmitter

解耦业务代码:事件驱动模型的优雅实现

在复杂的企业级后端应用中,当我们执行一个核心操作(比如:用户注册)后,往往需要触发一系列“副作用”次要流程:发送欢迎邮件、发放新人优惠券、通知运营系统、记录注册日志等。如果把这些杂七杂八的逻辑全部硬编码塞在 UserService.create() 里,代码会变得极其臃肿,严重违反“单一职责原则”。 NestJS 官方提供了 @nestjs/event-emitter 模块,它对底层的 E...

nestjs @compodoc/compodoc

生成项目代码架构和内部技术文档

在企业级项目开发中,良好的代码文档是降低团队沟通成本的关键。NestJS 默认完美支持基于 TypeScript 和装饰器的开发模式,这使得我们可以直接使用 Compodoc 来为整个系统生成一份静态的代码架构和内部技术文档。 Compodoc 最初为 Angular 量身打造,但由于 NestJS 在架构上(Module, Controller, Provider 等)与 Angul...

nestjs class-validator 教程

内置装饰器说明和如何自定义装饰器

在 NestJS 项目中,对用户提交的数据进行严格校验是必不可少的环节。NestJS 官方推荐使用 class-validator 配合 class-transformer 和 ValidationPipe 来完成优雅的、基于装饰器的数据校验(主要在 DTO 中使用)。 本文将介绍如何开启全局验证、常用的内置验证装饰器,并手把手教你编写自定义验证装饰器。 1. 安装与开启全局验证 首先...

nestjs DTO,VO 和 Entity

概念图解

在构建企业级 NestJS 后端应用时,随着业务复杂度的增加,直接让一个对象(如数据库实例)从头跑到尾是非常危险且难以维护的。为了保证各个架构层级(网关层、业务逻辑层、数据访问层)的职责分离,我们需要引入 DTO、Entity 和 VO 这三种核心数据载体。 本文将通过概念、流程图以及实际代码演示,带你彻底搞懂它们在 NestJS 中的定位。 架构层级划分 在企业级 NestJS 后端...

nestjs Redis GEO 快速入门

玩转地理位置:附近的人与门店搜索

在众多 LBS(Location-Based Services,基于位置的服务)应用中,像“附近的人”、“查找周围的共享单车”、“附近的餐厅”这样的需求层出不穷。如果在关系型数据库中直接使用复杂的经纬度公式去计算并排序距离,不仅计算代价大,而且性能极差。 Redis 自 3.2 版本之后引入了 GEO 数据结构,专门针对地理坐标的空间计算场景进行了高度优化。本文将带领你在 NestJS 中...

nestjs Nginx 实现灰度系统-多租户和非多租户

手把手教你搭建平滑过渡的灰度环境

灰度发布(又称金丝雀发布)是服务发布平滑过渡的重要手段。它可以在不中断核心业务的情况下,让部分用户先体验到新版本。如果有问题也能快速回滚,将影响面控制在最小。 今天我们来看一下,如何使用 Nginx 分别在非多租户(单租户)场景和多租户场景中实现一套优雅的灰度系统。 什么是灰度发布? 简单来说,灰度发布就是: 部署了新版本(V2),并保留老版本(V1)。 当流量进入 Nginx 网...

nestjs Nginx 核心用法

静态资源托管与反向代理负载均衡

在后端及大前端部署架构中,Nginx 一直扮演着举足轻重的角色。本文将带你通过 Docker 快速上手 Nginx,并深入掌握它的两大核心用法:静态资源托管与动态资源的反向代理及负载均衡。 一、配置与基础目录结构(基于 Docker) 我们通常通过 Docker 来快速拉起 Nginx 服务器: 1 docker run -d -p 80:80 --name my-nginx ngin...

nestjs passport-github2 实现Github第三方登录

在现代 Web 网站中,提供第三方 OAuth 登录(如 GitHub、Google、微信)可以极大降低用户注册的门槛。本篇文章将带你在 NestJS 中,利用 passport-github2 策略,实现标准的 GitHub OAuth2.0 授权登录流程。 准备工作:申请 GitHub OAuth App 在开始写代码之前,你需要去 GitHub 申请一个 OAuth Applica...