广告
广告
广告
前言回老家之后找到了之前忘记带走卖掉的极路由4,于是想着刷个鼎鼎大名的OpenWrt用一用,在恩山论坛找到了一个23年12月的固件,非常感谢那些还在更新的大佬,伸手党的我下载完刷入后就想着试试OpenClash,但是遇到了一些困难,折腾了几个小时才堪堪完成,期间也碰到了好多问题,为此写一篇教程,以便后续需要。教程[hide]配置OpenClash刚安装完OpenWrc,部分固件是会携带一些编译好的服务在里面,其中就会有OpenClash,这个玩意懂的都懂,作为一个程序员,我还是会有经常访问github的需求,但是国内网络环境真的一言难尽,搞这个也是刚需。假设我们现在已经有订阅连接了,我们...
前言安装stfp本意是因为OpenClash的内核更新没法通过在线的方式直接更新,谷歌搜索到了一篇本地上传文件更新的教程,教程上说通过ftp上传下载的文件,但是通过NxShell的ftp打开时提示:cannot read properties of null (reading 'readdir')显然OpenWrt自己没有sftp服务,需要自己安装。OpenWrn的账号和密码就是路由器账号密码,ssh地址为路由ip地址教程[hide]由于OpenWrn使用的是Dropbear这个ssh管理软件包,这是个比较轻量级的软件包,常用于嵌入式系统和小型足以不需要所有 Open...
前言Nestjs和Prisma的打包部署教程很少,网上比较热门的一个就是利用webpack将Nestjs打包 ,它和前端的打包差不多,会把所有的依赖项打包进来,生成的dist目录,可以直接单独部署,而如果我们使用Nestjs提供的build命令打包,不改动它的情况下,它只会将开发目录中的ts文件,转换成js文件,丢入dist目录中,其他什么也不做,就是个ts转js。这估计会让大部分人诧异,如果遵循官方这种方式,你在启动node服务的时候就必须使用dist目录下的main.js文件了。但是还要考虑环境变量等文件,我们下面细说。Prisma的打包部署需要考虑两方面:一是需要同步数据库模型,也...
前言在后端服务中,我们总是会遇到一些不安全的情况,毕竟web本身也不是一点漏洞都没有,好在有一些便捷的插件拱我们使用。helmet,通过设置 HTTP 响应标头来帮助保护 Express 应用程序;express-rate-limit,用于限制对公共 API 和/或终结点(例如密码重置)的重复请求,防止暴力攻击;本来还有一个跨域处理的CORS插件,但是目前还没有时间实际部署上线,所以在没有实际经验暂时就不写了,到时候单开一篇文章。安装依赖pnpm i helmet express-rate-limit教程这两个插件我们都需要在main.ts中启用。main.tsimport { Nest...
前言日志的记录在后端开发中是不可或缺的,在node中有一个很有名的库winston,这个库支持多种日志传输方式,比如本地文件,控制台,远程传输等。而nestjs有一个winston的模块库:nest-winston既然有了模块,那说明什么?说明我们可以通过依赖注入的形式,在其他地方直接调用模块的服务,从而实现日志记录。在log记录之前,需要分析我们要记录什么内容,比如最重要的错误日志,当发生错误的时候,我们需要记录日志,方便后续在生产环境查看问题,其次就是请求日志记录,我们记录用户的请求,url、ip地址、路由地址、请求参数等,以及我们的响应数据,也就是发送给前端的数据,针对这三种需求我...
前言之前使用了crypto-js做了一个md5加密用户密码的操作,但是由于该库本身没有提供比对方法,于是自己去实现了一个方法,而且还需要自己提供一个唯一值盐。最近发现bcrypt这个库更好用,于是改用它了。安装依赖pnpm i bcrypt pnpm i @types/bcrypt -D教程原来使用crypto-js的MD5方法,需要自己提供盐(salt),之前的做法是创建一个环境变量,然后预设一个定死的string字符串,这就导致我们需要维护一份唯一值的盐,有点麻烦。而bcrypt自身可以生成盐,并且它的盐会通过某些方式存储在加密后的字符串上,然后比对的时候,我们不需要知道之前它的盐是...
前言最近网络不太行,发现pnpm在下载一些库的时候经常卡住不动了,我记得推崇pnpm的时候,大伙都说pnpm不需要换源下载也很快,显然没有理想中那么好,无奈只能换源解决问题了。教程换淘宝源:pnpm config set registry https://registry.npmmirror.com 还原:pnpm config set registry https://registry.npmjs.org查看当前使用的源:pnpm get registry pnpm好像目前没看到有什么库能交互式操作切换。新方案我最近安装pnpm都是通过npm来安装的:npm i pnpm -g然后我发...
前言在之前的文章,我们实现了一个jwt的权限管理,通过一个自定义的Public装饰器声明公共接口,再通过app.module.ts添加一个全局守卫JwtAuthGuard。但是这种方式只能判断这个用户是登录了还是未登录了,没法实现更细化的权限管理,比如一个普通用户,他是无法管理自己的账号的,而管理员缺可以控制普通用户的账号,是禁用还是正常使用。显然我们需要一个更加细化的权限管理方式,经典就是 RBAC(Role-Based Access Control)角色访问控制设计。RBAC在RBAC中是通过不同的角色来实现权限的划分,比如普通用户user只能查看文章列表,而admin管理员是可以增...
Prisma是一个现代的数据库访问库,它本身不直接提供软删除(soft delete)和硬删除(hard delete)这样的内建机制,但你可以在应用层面实现这两种删除策略。硬删除:直接从数据库中删除记录,这是数据库最基本的删除操作。在Prisma中,你可以使用delete或deleteMany方法来执行硬删除。软删除:软删除通常是通过在数据库记录中设置一个标记(如deletedAt时间戳字段)来实现的,而不是实际从数据库中移除记录。这样做的好处是,你可以保留数据,以便将来需要恢复或保留删除记录的历史。为了在Prisma中实现软删除,你可以按照以下步骤操作:在你的模型中添加一个如dele...
前言在之前的文章中我们已经实现了格式化响应的数据结构,现在我们就来处理响应的具体数据,很常见的一个场景:我们查询了一条用户信息,这个信息可能包含了用户的账号、密码、昵称、头像,但是我们肯定不能把密码也返回给前端,所以我们就需要控制返回的数据。有很多种做法,比如简单的就是通过js的delete操作符去删除对象上的属性。如果是使用prisma的话,可以在查询的时候,配置select属性来限制返回的查询数据。// 假设我们有一个User模型,带有id, name, email和password字段 // 我们想要返回用户的id和name,但不返回email和password const us...
区分两种注册方式在nestjs中我们有两种注册全局的方式,一种是通过NestFactory.create得到app实例,在通过app.useGlobalXXX的方式去注册全局的东西,比如全局拦截器,全局过滤器等。import { NestFactory } from "@nestjs/core"; import { AppModule } from "./app.module"; import { ResultFormatInterceptor } from "@/utils/interceptor"; async funct...
前言这个是非常常见的一种配置,我们的接口通过域名访问,但是这个域名不一定全部都给后端使用,所以一般后端服务都是基于域名,通过一个前缀路由来实现区分,比如:www.xxx.com # 后端服务1 www.xxx.com/v1 # 后端服务2 www.xxx.com/v2通过一个统一的路径名来区分。教程在nestjs中,这个配置放在了文档比较末端的地方,代码如下:import { NestFactory } from "@nestjs/core"; import { AppModule } from "./app.module"; async f...
前言在前端项目开发的时候,使用路径别名@/已经是基操了,但是在后端开发的时候,如何使用路径别名确实也没怎么了解过,配置后才发现真的超级简单。教程由于Nestjs本身就是ts运行的,所以在项目初始化后就有tsconfig.json文件了,我们只需要配置一下paths就可以直接使用了。tsconfig.json{ "compilerOptions": { "paths": { "@/*": ["src/*"] } } }使用:import {...
前言Nestjs的文件上传官方文档给的讲解非常少,在掘金搜对应文章也大多数不全,有的都是好几年前的处理了,这里贴一下我学习到的处理方式。首先我们需要三个依赖:multer,这个是一个express的中间件,它只会处理multipart/form-data 类型的表单数据,主要用于上传文件。@types/multer 这个是multer的一个类型声明依赖。@nestjs/platform-express,这个依赖提供了上传模块和拦截器用于处理上传,它本身也依赖于multer。大概流程:首先我们从 @nestjs/platform-express引入MulterModule模块进行注册,为此...
NestJS 提供了多种预设的错误类,这些错误类对应于常见的 HTTP 状态码,并在 @nestjs/common 包中。BadRequestException: 对应于状态码 400(Bad Request),表明客户端请求的语法错误或无法处理请求。UnauthorizedException: 对应于状态码 401(Unauthorized),表明请求需要用户的身份认证。NotFoundException: 对应于状态码 404(Not Found),表明服务器找不到请求的资源。ForbiddenException: 对应于状态码 403(Forbidden),表明服务器理解请求但拒绝...
前言Nestjs文档中有两种鉴权方式,一种是自定义一个守卫,在守卫中自己从上下文header中取出token信息,然后自己解析判定。import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { jwtConstants } from './constants'; import { Request...
前言jwt生成,nestjs官方有一个专门的库@nestjs/jwt,它是一个模块,我们只需要将他注册为全局模块,并且传入secret密匙就能直接去使用它的服务了。教程先安装依赖:pnpm i @nestjs/jwt在app.module.ts中引入该模块,通过useFactory工厂模式,获取到ConfigModule提供的ConfigService服务,从而拿到环境变量文件中配置的secret。.env.development在环境变量中配置TOKEN_SECRET# token-secret TOKEN_SECRET="xxxxx"注意不要泄露这个密匙。app....
简介所有的数据库中,对密码的保存永远不是明文的,这是一种常识,我们使用Nestjs和Prisma创建用户时也是一样的,对用户的密码也不是明文的。有些教程使用argon2库来加密密码,但是这个库在windows上永远是安装失败,为此直接放弃使用它,改用crypto-js,来实现相同功能。教程先安装依赖:pnpm i crypto-js @types/crypto-js然后我们封装一个简单的工具文件:md5.tsimport { MD5 } from "crypto-js"; /** * @description: hash加密 * @param {string} ...
前言一个很经典的业务需求,注册用户时需要判断用户的账号是否已经存在,登录的时候也需要判断用户是否存在,只不过一个需要存在时报错,另一个需要判断不存在时报错。教程官方文档:class-validator创建文件:IsFieldExist.tsimport { registerDecorator, ValidationOptions, ValidationArguments } from "class-validator"; import { PrismaClient } from "@prisma/client"; let prisma: Pris...
前言默认情况下class-validator这个库本身并没有提供二次密码校验的方式,所以我们需要自己去实现这个功能,那么自然是需要实现一个符合库规范的属性装饰器了。首先我们需要知道,在class-validator中,自己实现一个校验方式,是可以获取到校验对象的,既然可以获取到校验的对象,自然可以读取对象里的那些属性了,为此实现一个二次密码校验是非常简单的。教程假设我们的数据对象如下:{ name: "", password: "", confirmPassword: "" }我们需要判断confirmPasswor...
简介在学习使用Nsetjs中了解了DTO这个东西,但是作为一个前端开发人员,其实不太懂这个东西是干什么的,于是自己去了解了一些,并记录一下。什么是DTO?nestjs框架本身借鉴了很多后端框架的经验,其中DTO就是一种在java开发广泛使用的一种设计模式。DTO的全称是Data Transfer Object,是一个用于客户端与后端服务传输数据的一种对象形式,在nestjs中更细节一点,就是前端传输的数据会在Controller控制层使用前,被转换成DTO数据对象,其实就是class类通过一些方式将数据赋值到这个类的实例对象上。后续的操作读取其实都是使用的DTO对象,同时我们的数据校验也...
前言在nestjs中,我们在controller或者在service中去调用一些依赖,不是像写vue那种,直接es6导入导出,而是通过依赖注入的形式,在类构造函数constructor中声明需要的依赖,nestjs会在实例化的时候将对应的依赖实例作为参数传入。示例:app.controller.tsimport { Controller, Get } from "@nestjs/common"; import { AppService } from "./app.service"; @Controller() export class AppCo...
前言在一个稍微正式点的项目中,它的环境变量文件肯定多个的,一般会有开发用的环境变量文件,正式上线的环境变量文件,测试用的环境变量文件,甚至还有更多,但是在nestjs和prisma的官方文档中,都是只用一个环境变量文件.env,显然有点弱了,为此写一篇关于如何使用多环境变量文件的教程。依赖安装pnpm i cross-env dotenv dotenv-cli -D理论上讲dotenv可以不用明确安装,但是但是安装一些,以后也用得到,比较是一个基建类的库,用于解决环境变量相关方面。cross-env 用于指定NODE_ENV。dotenv-cli是给prisma用的。创建环境变量文件在项...
最近评论