nest js 英文官网 NestJS - A progressive Node.js framework

nestjs 中文网  NestJS 简介 | NestJS 中文文档 | NestJS 中文网

nestjs 中文网2  Nest.js 中文文档

以上是三个自学文档 

连接mongodb

/* app.module.ts */
 import { Module, Options } from '@nestjs/common';
 import { AppController } from './app.controller';
 import { AppService } from './app.service';
 import { UserModule } from './user/user.module';
 // 引入 Mongoose 
 import { MongooseModule } from '@nestjs/mongoose';
import { UploadModule } from './upload/upload.module';
 @Module({
   // 用 forRoot 方法连接数据库AddressBook
  imports: [UserModule, MongooseModule.forRoot(), UploadModule],


   controllers: [AppController],
   providers: [AppService],
 })
 export class AppModule {}

nest g res user 快速生成一个模块

nestjs教程 nestjs 文档_nestjs教程

实体类文件夹entities是后来自己建的,注意,我们所有有和数据库有关的操作,包括新增文档的字段,都必须要在此显示的声明

point.entity.ts

// 实体类得分表
 import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
 // @Prop 装饰器接受一个可选的参数,通过这个,你可以指示这个属性是否是必须的,是否需要默认值,或者是标记它作为一个常量,下面是例子

 import { Document } from 'mongoose';

type Eegres={
    mood:string
    presure:string
    relax:string
    concentrate:string
    tired:string
}


//  每个Schema对应MongoDB中的一个collection。
 @Schema()
//  描述集合的字段
 export class Point extends Document {
   
//    name: string;
   // 设置值为必填
//    @Prop({ required: true })
//    age: number;
  
//    height: number;
  
   @Prop()
   gaintestPoint:string
   @Prop()
   looktestPoint:string[]
   @Prop()
   viocetsetPoint:string
   @Prop()
   eegResult:string[]

   @Prop()
   totalityTestPoint:string
   @Prop()
   gameReview?:string
   @Prop({required:true,ref:'User'})
   personID:string
   @Prop()
   Addvice?:string
   @Prop()
   gaintestMp4?:string
 }
 export type PointDocument = Point & Document;
  // SchemaFactory 是 mongoose 内置的一个方法做用是读取模式文档 并创建 Schema 对象
 export const PointSchema = SchemaFactory.createForClass(Point);

/**
 * @name 
 * 原始 Schema 定义也可以被传递给装饰器。这也非常有用,举个例子,一个属性体现为一个嵌套对象而不是一个定义的类。要使用这个,需要从像下面一样从 @nestjs/mongoose 包导入 raw()
 * @Prop(raw({
         firstName: { type: String },
         lastName: { type: String }
        }))
   details: Record<string, any>;

 *  https://docs.nestjs.cn/9/techniques?id=mongo
 */

ref:'User'是关联User这个集合,后面会讲

user.entity.ts

// export class User {}


 /* user.schema.ts 数据库字段映射,相当于实体类*/
 import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
 // @Prop 装饰器接受一个可选的参数,通过这个,你可以指示这个属性是否是必须的,是否需要默认值,或者是标记它作为一个常量,下面是例子

 import { Document } from 'mongoose';

//  每个Schema对应MongoDB中的一个collection。
 @Schema()
//  描述集合的字段
 export class User extends Document {
   
//    name: string;
   // 设置值为必填
//    @Prop({ required: true })
//    age: number;
  
//    height: number;
   @Prop()
   age:string
   @Prop()
   identifier:string
   @Prop()
   name:string
   @Prop()
   nation:string
   @Prop()
   grade:string
   @Prop()
   schemeNum:string
   @Prop()
   organ:string
   @Prop()  
   sex:number
 }
 export type UserDocument = User & Document;
  // SchemaFactory 是 mongoose 内置的一个方法做用是读取模式文档 并创建 Schema 对象
 export const UserSchema = SchemaFactory.createForClass(User);

以下是一个crud模板

user.controller.ts

/* user.controller.ts */
// 引入 Nest.js 内置的各个功能
import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
// 引入用户服务
import { UserService } from './user.service';
// 引入创建用户 DTO 用于限制从接口处传来的参数
import { CreatePointDto,createPerson } from './dto/create-user.dto';

// 配置局部路由
@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) { }


  @Get('getpoints')
  async getPoints(@Query() query){
 
    
    return  await this.userService.getPoint(query.sid)
       
  }
 // 创建得分表
 @Post('createpoint')
 async createPoint(@Body() body: CreatePointDto) {
   return this.userService.create(body);
 }

// // 创建得分表
//   @Post('createUser')
//   async createUser(@Body() body: CreatePointDto) {
//     return this.userService.create(body);
//   }

// 添加用户
@Post('addUsers')
async addUsers(@Body() body:createPerson){
    return this.userService.addPerson(body)
}

// 根据名字查找用户
@Get('findUserName')
async findUserName(@Query ( ) query:{name:string}){

  
    return this.userService.findname(query.name)
}

  //查找所有 user 路由
  @Get('findAll')
  async findAll() {
    console.log('查找所有 user ');
    console.log(this.userService.findAll);

    return this.userService.findAll();
  }
  // 查找某一个用户路由
  @Get('findOne')
  async findOne(@Query() query: any) {
    // 从前端传来的参数中解出personID
    console.log(query.personID);
    
    return await this.userService.findOne(query.personID);
  }
  // 删除一个用户的路由
  @Delete(':sid')
  deleteUser(@Param() param: any) {
    console.log('dsdsdsd');

    return this.userService.delete(param.sid);
  }
  // 更改用户信息的路由
  @Put(':sid')
  updateUser(@Body() body: any, @Param() param: any) {
    return this.userService.updateUser(param.sid, body);
  }
}

 user.module.ts

/* user.module.ts */
  import { MiddlewareConsumer, Module ,NestModule, RequestMethod } from '@nestjs/common';
  import { UserController } from './user.controller';
  import { UserService } from './user.service';
  import { MongooseModule } from '@nestjs/mongoose';
  import { UserSchema ,User} from './entities/user.entity';
import {Point,PointSchema } from './entities/point.entity'

  import {LoggerMiddleware} from "src/logger/logger.middleware"
  @Module({
     // MongooseModule提供了forFeature()方法来配置模块,即用来关联数据库实体类,包括定义哪些模型应该注册在当前范围中。
     // 如果你还想在另外的模块中使用这个模型,将MongooseModule添加到CatsModule的exports部分并在其他模块中导入CatsModule。
     // 这里的 name:'Users' 为集合名称,与 service 中注入的表名称对应两者不一样会报错
    imports: [MongooseModule.forFeature([
      { name: User.name, schema: UserSchema, collection: 'Users' },
      { name: Point.name, schema: PointSchema, collection: 'point' }
  ]),

  ],
    controllers: [UserController],
    providers: [UserService],
  })

  // 不知道怎么实现就查询它的类型
  export class UserModule  implements NestModule  {
    // 接收一个消费者,调用apply方法来注册这个中间件并指定要作用的路由
    configure(consumer: MiddlewareConsumer) {
      // 三种写法,局部注册中间件
      // consumer.apply(LoggerMiddleware).forRoutes('user')
      // consumer.apply(LoggerMiddleware).forRoutes({path:'user',method:RequestMethod.GET})
      consumer.apply(LoggerMiddleware).forRoutes(UserController)

    }
  }

user.service.ts

import { Model } from 'mongoose';
import { InjectModel } from '@nestjs/mongoose';
// import { User, UserDocument } from 'src/blog/schemas/blog.schemas';
import { User, UserDocument } from 'src/user/entities/user.entity';
import { Point, PointDocument } from './entities/point.entity'

import { CreatePointDto,createPerson } from './dto/create-user.dto';
import { Injectable } from '@nestjs/common';
import { lookupService } from 'dns';
@Injectable()
export class UserService {
  // 注册Schema后,可以使用 @InjectModel() 装饰器将 User 模型注入到 UserService 中:
  // 这里的'Users'需要和user.module定义的数据库表名对上
  constructor(
    @InjectModel(User.name) private userTest: Model<UserDocument>,
    @InjectModel(Point.name) private pointTest: Model<Point>
  ) { }

  // 查找全部的得分表1
  async getPoint(parmas): Promise<any> {
    if (!!parmas === false) {
      // 查询全部 根据参数判断1
      return await this.pointTest.find({}).populate('personID').exec()
    }
    else {
      return await this.pointTest.find({ personID: parmas }).populate('personID').exec()
    }
  }

  // 查找得分表
  async getPointonly(personID: string): Promise<any> {
    const temp = await this.pointTest.find({ _id: personID }).populate('personID').exec();

    
    return temp;
  }

  // 添加得分表
  async create(createUserDto: CreatePointDto): Promise<Point> {
    console.log(createUserDto);

    const createUser = new this.pointTest(createUserDto);
    const temp = await createUser.save();
    return temp;
  }

  //添加用户
  async addPerson(createPerson:createPerson){
    console.log(createPerson);

    const createUser = new this.userTest(createPerson);
    const temp = await createUser.save();
    return temp;
  }

  // 通过名字查找用户
async findname(name:string){
  console.log(name);
  
      const data = await this.userTest.find({
        name:name

      })
    return data
}

  // 查找所有用户
  async findAll(): Promise<User[]> {
    // 这里是异步的
    const temp = await this.userTest.find().exec();
    console.log(__dirname);
    return temp;
  }

  // 查找
  async findOne(personID: string): Promise<User[]> {
    // 这里是异步的
    // console.log(personID);

    const temp = await this.userTest.find({ _id: personID },).exec();
    return temp;
  }
  // 删除
  async delete(sid: number) {
    // 这里是异步的  remove 方法删除成功并返回相应的个数
    const temp = await this.userTest.deleteOne({ _id: sid });
    return temp;
  }
  // 修改
  async updateUser(sid: string, data: any) {
    // 这里是异步的  
    const temp = await this.userTest.updateOne({ _id: sid }, { $set: data });
    return temp;
  }
}

 这里有个问题

nestjs教程 nestjs 文档_typescript_02

 这里会明确这两个变量的类型,

类型分别为

nestjs教程 nestjs 文档_User_03

 ts 中类也可以作为接口被传入泛型,与interface的功能一致,这里其实我是学习网上的写法,网上的写法是Model<UserDocument>我的写法则是Model<User>

就类型来说Point与PointDocument应该是等价的

事实上ide推导的类型两者完全一致