nestjs开发及流水线相关问题记录
背景
前段时间负责将组内项目接入自动化流水线, 磕磕绊绊最后也算把全流程走通并且在线上稳定运行了, 把过程中遇到到的问题和知识点作用做个记录总结.
nestjs
这里不会介绍 controller, provider 是啥, 应该怎么使用, 这些直接看官方文档就能理解了, 只会记录使用 nestjs 中的问题的解决过程, 官方文档模棱两可的描述以及底层原理的思考.
1. eslint wrong error “is defined but never used”
初始化项目时遇到 import 所有装饰器例如@Injectable()
, @Get()
, 并且在对应文件中使用了, eslint 还是会提示**“is defined but never used”**.
需要把@typescript-eslint/*
包升级到 5.35.1 以上
2. 及时更新@nestjs/cli 脚手架
使用脚手架初始化项目时, 当引入第三方 Module 时出现了各种各样的问题, 最后发现脚手架@nestjs/cli
之前安装的版本是 v7, 而现在最新大版本已经迭代到 v9 了, 很多第三方库版本都已经不兼容旧的脚手架新建的项目, 升级到 v9 后重新初始化项目第三方 Module 引入问题消失.
3. CacheModule
这里项目中使用的是 redis, 以此为例:
在不同模块中引入 CacheModule 的方式:
- app.module.ts 中设置
isGlobal: true
1 |
|
- 在每个 module 中单独引入, 参数都要带上, 否则会使用默认的内存缓存.
4. forRoutes
指定中间件作用路由时, 不需要加上设置的 prefixPath, 如果想作用路由下所有接口使用/*
linux
流水线中难免会有频繁的 linux 操作, 记录用到的命令
rsync
同步文件, 和cp
类似, 但是可以通过参数过滤不复制的文件.
常用的参数:
-a, --archive
: 归档模式,表示以递归方式传输文件,并保持所有文件属性
--exclude-from
: 这是选择rsync
而不是cp
的最大原因, 该配置能够在复制文件时指定过滤的文件.
--exclude
: 指定排除不需要传输的文件模式, 例如--exclude=exclude.list
, 就可以在目录下创建 exclude.list, 内容为过滤的文件模式, 例如:
1 |
|
redis
常用命令:
flushdb
: 删除 db 中所有数据ttl key
: 剩余过期时间get key
: 查询 key 值- redis 的值如果是 number, 会显示类似"1234"; 如果是 string, 会显示"\“1234\”"
- redis connect refuse 解决方法:
redis.conf 中将 protect mode yes 改为 no
bind 127.0.0.1 注释#
docker
常用命令:
docker run -dit --rm imageId bash
: 创建容器并在容器启动 bash 交互, 退出后自动删除容器docker run -dit imageId
: 创建容器docker exec -it id bash
: 在运行的容器中启动 bash 与其交互docker history imageId
: 通过镜像 id 查看上层 layer 的 Dockerfiledocker logs containerId
: 输出容器日志docker run -d -p 127.0.0.1:80:80 nginx:alpine
运行时指定端口映射, 需要注意的是 Dockerfile 中的EXPOSE关键字只是描述端口号, 没有实际作用docker build -t v0.0.1 --ulimit nofile=100002:100002 packages/wework-bot
: 可以指定上下文, 如果在 Dockerfile 中配置COPY . . 会将 packages/wework-bot 内容全部复制到容器的WORKSPACE下
git
git rev-parse HEAD
: 最近的一次 commit idgit merge --no-edit
: 不触发交互修改信息, 用于代码中调用git revert commitId
: 回退指定 commit, 新增一条 commit 记录, 比如想回退 HEAD 最新提交, 则git revert HEAD
, 操作是可逆的.git reset commitId
: 回退指定 commit, 清除 commit 之后所有记录, 比如想回退 HEAD 最新提交, 则git reset --hard HEAD^
, 操作不可逆.git pull --rebase
: pull 默认会生成一条 merge 记录, --rebase 指定不生成 merge 记录
其他
pm2
由于服务部署在线上环境的 docker 中, pm2 start
不支持容器中启动, 这就导致 Dockerfile 中逻辑执行完容器直接 Exit. 官方提供pm2-runtime
用于 docker 场景, 运行服务命令pm2-runtime start ecosystem.config.js
, 和 pm2 不同, pm2-runtime 不支持 restart.
多环境 git
由于日常都是在内网的 linux 开发机上办公(通过 vscode ssh-remote), ssh 的内容就涉及到了多环境, 包括本地与开发机连接, 内网 git 操作, github 操作, 参考这篇文章: 多环境 git 配置
xml 请求体
body-parser 只支持处理 Content-Type 为 application/x-www-form-urlencoded
, multiple/form-data
, application/json
的请求体; 微信客服号这种请求体是 xml 格式的 body-parser 处理不了, req.body 输出也是{}.
需要结合body-parser-xml库对 body-parser 做封装:
1 |
|
formData
在 node 中 formData 的使用和浏览器中一致, 当 formData append 的值是文件可读流时, 文件的基本属性就会丢失, MIME 变成oct-stream, filename 变成一串 MD5 码, 可以通过 options 中配置指定文件基础信息
1 |
|
centos7
- centos7 安装最新版本的 git(不用手动编译)
- yum 源的目录: /etc/yum.repos.d/
- Transaction check error: 安装包冲突
rpm -e 冲突包名 --nodeps