最“完美”的后端语言nest

88 阅读3分钟

最“完美”的后端语言nest.js。俗称前端的spring boot。

本文主要阐述了,作者本人对于nest的使用心得和踩到的“屎坑”。 望于君共勉,学习!!! 有什么好的建议,希望大家指出。

NestJS 简介 nestJS中文文档

Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力,使用并完全支持 TypeScript (仍然允许开发者使用纯 JavaScript 进行开发),并结合了 OOP (面向对象编程)、FP (函数式编程)和 FRP (函数响应式编程)。

在底层,Nest 构建在强大的 HTTP 服务器框架上,例如 Express (默认),并且还可以通过配置从而使用 Fastify

Nest 在这些常见的 Node.js 框架 (Express/Fastify) 之上提高了一个抽象级别,但仍然向开发者直接暴露了底层框架的 API。这使得开发者可以自由地使用适用于底层平台的无数的第三方模块

nest强制更改数据库罪魁祸首

entities

当你根据官方示例entities: [__dirname + '/**/*.entity{.ts,.js}']会同步数据库和你定义的实体类。

这个时候就有可能会出现非常操蛋的事情,数据库被删了。 哎呀我的妈,咋咋回事🙁😠!!

实际上是代码定义的实体类与数据库上面的字段亦或者是类型不同的时候,nest会强行修改数据库中的内容。

但凡线上出现这中情况,跑路都来不及👻💩👻💩

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      // 连接数据库
      type: 'mysql', // 数据库类型
      host: 'xxxx', // 数据库ip地址
      port: xxx, // 端口
      username: 'xxx', // 密码
      database: 'xxx', // 数据库名称
      // entities: [__dirname + '/**/*.entity{.ts,.js}'], // 扫描本项目中.entity.ts或者.entity.js的文件
      // synchronize: true, // 定义数据库表结构与实体类字段同步(这里一旦数据库少了字段就会自动加入,根据需要来使用)
      autoLoadEntities: true, //自动查找entity实体
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

nest关联表查询配置不洽当亦会修改数据库字段数值

关键词 OneToOne ManyToOne JoinColumn

我们在查询数据库的时候涉及到链表查询父表和子表直接有这某种关联时,可以通过表关联查询。

首先建立2个实体类 sysUser userRole


import { Entity, Column, PrimaryGeneratedColumn, OneToOne,JoinColumn } from 'typeorm';
import { userRole } from './userRole.entity'; // 子表

@Entity()
export class sysUser {
  @PrimaryGeneratedColumn({ type: 'bigint', name: 'user_id' })
  userId: number;
  //.....

  /* 表关联 一对一***/
  @OneToOne(() => userRole, (userRole) => userRole.userinfo)
  @JoinColumn({ name: 'dept_id' })
  permission?: userRole;
}

重点在于ManyToOne的第三个入参{cascade:false} 注:如果数据库 2个表的关联字段类型不统一。nest.js就会迷之修改数据了!如果设置了cascade:false就不会强制修改。

import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { sysUser } from './sysUser.entity'; // 父表

@Entity()
export class userRole {
  @PrimaryGeneratedColumn({ type: 'bigint' })
  id: number;

  //....
  @ManyToOne(() => sysUser, (user) => user.permission, {
    cascade: false,   // 这个参数会强制不修改数据库字段的值
  })
  @JoinColumn({ name: 'dept_id' })
  userinfo?: sysUser;
}

使用relations进行表查询


  async login(sysUser: sysUser) {
    const data = await this.sysUserRepository.findOne({
      where: { userName: sysUser.userName },
      relations: ['permission'], // 关联表字段
   });

  }

最后注册实体类型到模块