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

栏目: 数据库 · 发布时间: 5年前

内容简介:昨天发现有这么一个框架,大概看了下官方文档,号称适合尝尝鲜,目前有

昨天发现有这么一个框架,大概看了下官方文档,号称 Nodejs 版本的 spring(java)=>对express的改造

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

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

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

我们后台大佬是用的 PHP ,我打算用空闲时间拿 nestjs 重写我们后台管理系统提供的那部分接口

其他就不多说了

官网 | NestJS迭代计划(roadmap)

效果图

失败

失败的原因有那么几个;

  • 数据库的配置信息跟实际要链接的数据库数据不一致(比如数据库名字,比如用户名密码)
  • 隧道转发的端口给本地其他服务占用了,比如 mysql 本地启动的(默认3306)
    • 这时候要么改端口映射,要么关闭本地数据库
  • ts 语法错误
NestJS折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及 <a href='https://www.codercto.com/topics/18170.html'>Linux</a> 信息过滤裁切基础
NestJS折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及Linux信息过滤裁切基础

成功

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

代码

db.ts(src/config)

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

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

export const MySqlConfig: any = {
  type: 'mysql',
  host: 'localhost',
  port: 3306,
  username: 'root',
  password: '1234567',
  database: 'shengxi_v2',
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  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+ 语法

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


以上所述就是小编给大家介绍的《NestJS折腾记- (0) 开胃菜, TypeORM 连接远程的MySQL(ssh tunnel)及Linux信息过滤裁切基础》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大思维:集体智慧如何改变我们的世界

大思维:集体智慧如何改变我们的世界

杰夫·摩根 / 郭莉玲、尹玮琦、徐强 / 中信出版集团股份有限公司 / 2018-8-1 / CNY 65.00

智能时代,我们如何与机器互联,利用技术来让我们变得更聪明?为什么智能技术不会自动导致智能结果呢?线上线下群体如何协作?社会、政府或管理系统如何解决复杂的问题?本书从哲学、计算机科学和生物学等领域收集见解,揭示了如何引导组织和社会充分利用人脑和数字技术进行大规模思考,从而提高整个集体的智力水平,以解决我们时代的巨大挑战。是英国社会创新之父的洞见之作,解析企业、群体、社会如何明智决策、协作进化。一起来看看 《大思维:集体智慧如何改变我们的世界》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具