NestJS 6.x折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及Linux信息过滤裁切基础

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 昨天发现的框架,看了下官方文档,号称Nodejs版本的spring(java)开发模式有ng6既视感,这对有ng经验的小伙伴来说,莫名的亲切..适合尝尝鲜,目前有1W+ star, 上正式线我觉得等version 6会稳定些,这个系列我会以一个真实项目的开发进展作为基础,一边爬坑一边水文;


前言


昨天发现的框架,看了下官方文档,号称Nodejs版本的spring(java)

开发模式有ng6既视感,这对有ng经验的小伙伴来说,莫名的亲切..


适合尝尝鲜,目前有1W+ star, 上正式线我觉得等version 6会稳定些,


这个系列我会以一个真实项目的开发进展作为基础,一边爬坑一边水文;


官网 | NestJS迭代计划(roadmap)


  • 2018-12-7: mysql 8 链接报认证问题



  • 远程数据库是5.7, 备份下来切换到本地的mysql8,因为mysql 8升级了安全机制,没法类似以前那样直连.


我们需要修改下,使其支持


# 登录/切换数据库/用新的机制更新我们的密码/ 刷新权限
-> mysql -u root
-> use mysql
-> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
-> flush privileges;


效果图


失败


失败的原因有那么几个;


  • 数据库的配置信息跟实际要链接的数据库数据不一致(比如数据库名字,比如用户名密码)
  • 隧道转发的端口给本地其他服务占用了,比如mysql本地启动的(默认3306)
  • 这时候要么改端口映射,要么关闭本地数据库
  • mysql 8+需要修改特权认证
  • ts语法错误






成功




代码


db.ts(src/config)


温馨提示: 若是要用__dirname,确保配置文件在根目录,否则请改用相对路径,不然会找不到实体


synchronize是同步,会自动同步到数据库,比如建表什么的(根据实体)


import { join } from 'path';
const EntityRecursivePath = join('..', '/**/*.entity{.ts,.js}');
export const MySqlConfig: any = {
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: '!=basestagging**',
  database: 'shengxi_v2',
  entities: [EntityRecursivePath],
  synchronize: true,
};
复制代码

app.module.ts

UsersModule 里面写了对应的服务,实体的关联

import { Module, NestModule, MiddlewareFunction } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
// 用户模块,注册,登录,更新个人信息
import { UsersModule } from './modules/users/users.module';
// 数据库ORM
import { TypeOrmModule } from '@nestjs/typeorm';
import { MySqlConfig } from './config/db';
@Module({
  imports: [TypeOrmModule.forRoot(MySqlConfig), UsersModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule implements NestModule {
  // consumer 这里可以挂在中间件什么的
  configure(consumer: MiddlewareFunction): void {
    consumer
      .apply(null)
      .with('AppModule')
      .forRoutes('/');
  }
}


users.entity.ts


import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
// entity装饰器提供一个options可以配置关联的表名,引擎等等,具体看她的interface
// 不提供name的话,,类名就是表名了
@Entity({
  name: 'sx_admin',
})
export class Users {
  @PrimaryGeneratedColumn() id: number;
  // 用户名
  @Column('varchar', { length: 100 })
  admin_name: string;
  // 用户密码
  @Column('varchar', { length: 255 }) admin_passwd: string;
  // 创建时间
  @Column('timestamp') created_at: number;
  // 更新时间
  @Column('timestamp') updated_at: number;
  // 是否启用
  @Column('int') admin_status: number;
}


剩下的姿势,就在services里面注入实体和ormRepository;


再到controller注入服务调用即可...返回的是Promise


要点提示及温馨提示


SSH隧道转发(SSH Tunnel)


远程数据库我们一般不暴露外接端口直连,安全隐患太高;


一般选择走ssh 隧道(很常用的接入方式),


通过ssh登录认证服务器,再转发本地的端口到远程端口,达到数据打通的姿势


  • ssh命令转发


ssh的命令解释(官方手册): 英文,写的很详细;


我们主要用了以下几个参数


-L: 端口转发

-C: 压缩传送数据

-f: 后台运行

-N: 不执行远程命令


常规alias


# 这条命令会在后台运行
alias mstunnel=ssh -L 3306:localhost:3306  root@xxx.xx.xx.xx -NCf
# 若是远程转远程 用-R 替换-L


传递参数的alias


shellalias不支持参数的传递,要传递只能写成function再赋值到alias

可以设置多个占位符,依次递增(比如端口,域名都变成外部传入什么的,看自己喜好了)


# ssh tunnel
function sst(){
  ssh -L 3306:localhost:3306  root@$1 -NCf
}
alias sst=sst


关闭会话(ssh tunnel)


分步进行的依赖lsof,kill


  • 找到对应的进程PID ,lsof -i tcp:22(查询谁用着22的端口,ssh tunnel默认走tcp)
  • kill -9 pid , -9 是终止进程


若是要一步到位的,就要借助几个命令一起了,awk,xargs以及管道(|)


# 意思就是
# 查询TCP且端口22的进程
# 输出第二行的第二列(第一行是列名)
# stdin 转为arguments  给kill 
lsof -i tcp:22 | awk 'NR==2 { print $2}' |xargs   kill -9
# 当然也可以当做一个表达式来写
kill -9 $(lsof -i tcp:22 | awk 'NR==2 { print $2}')
# 若是要同时关闭多个引用该端口的进程 , NR!=1 即可 , kill 支持杀多进程
# 有传递参数的alias记得用function 来实现!!!


若是ssh没有配置定时发送信号,一段时间后会自动停止会话(packet_write_wait:);

此时要么去配置,要么我们改写下alias , 用-o ServerAliveInterval=60 来保持连接的连接这


ssh -o ServerAliveInterval=60 -L  3306:localhost:3306  root@xxxx.xxx.xxx -NCf


IPV6就带上 -6


  • npm模块的姿势


可以通过安装ssh2,Promise成功后再去链接数据库;


不考虑用这种,因为实际服务器都是内部直连的,隧道我们也在开发过程用的比较多


总结


语法转义


  • 若是使用js文件


目前的版本,还是要考虑commonjs的写法,为什么这样说,


我把数据库链接的配置文件分离出来,不能用export default


导入的时候也不能用...(rest)解耦的方式. 不然会报语法错误


  • ts文件


可以任性使用ES6+语法


有不对之处请留言,会及时修正,谢谢阅读

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
网络安全 开发工具 git
配置本地环境以管理Git多账户SSH连接的方法
通过以上步駟设置后, 您可以轻松管理多個 Git 账户并且根据不同项目需求切换 SSH 密匙进行版本控制操作。
300 20
|
3月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
124 13
|
3月前
|
SQL 关系型数据库 MySQL
MySQL数据库连接过多(Too many connections)错误处理策略
综上所述,“Too many connections”错误处理策略涉及从具体参数配置到代码层面再到系统与架构设计全方位考量与改进。每项措施都需根据具体环境进行定制化调整,并且在执行任何变更前建议先行测试评估可能带来影响。
994 11
|
3月前
|
SQL 关系型数据库 MySQL
排除通过IP访问MySQL时出现的连接错误问题
以上步骤涵盖了大多数遇到远程连接 MySQL 数据库时出现故障情形下所需采取措施,在执行每个步骤后都应该重新尝试建立链接以验证是否已经解决问题,在多数情形下按照以上顺序执行将能够有效地排除并修复大多数基本链接相关故障。
340 3
|
3月前
|
SQL 监控 关系型数据库
查寻MySQL或SQL Server的连接数,并配置超时时间和最大连接量
以上步骤提供了直观、实用且易于理解且执行的指导方针来监管和优化数据库服务器配置。务必记得,在做任何重要变更前备份相关配置文件,并确保理解每个参数对系统性能可能产生影响后再做出调节。
355 11
|
4月前
|
存储 关系型数据库 MySQL
修复.net Framework4.x连接MYSQL时遇到utf8mb3字符集不支持错误方案。
通过上述步骤大多数情况下能够解决由于UTF-encoding相关错误所带来影响,在实施过程当中要注意备份重要信息以防止意外发生造成无法挽回损失,并且逐一排查确认具体原因以采取针对性措施解除障碍。
252 12
|
4月前
|
存储 关系型数据库 MySQL
使用命令行cmd查询MySQL表结构信息技巧分享。
掌握了这些命令和技巧,您就能快速并有效地从命令行中查询MySQL表的结构信息,进而支持数据库维护、架构审查和优化等工作。
403 9
|
3月前
|
Unix Linux Shell
指定端口-SSH连接的目标(告别 22 端口暴力破解)
本文介绍了 SSH 命令 `ssh -p 44907 root@IP` 的含义与使用方法,包括命令结构拆解、完整示例及执行过程详解,帮助用户安全地远程登录服务器。
310 0
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
安全 数据可视化 关系型数据库
何远程连接阿里云主机服务器(Linux系统)
何远程连接阿里云主机服务器(Linux系统)
2199 57
何远程连接阿里云主机服务器(Linux系统)