Nest.js初体验(一):连接数据库

238 阅读3分钟

我正在参加掘金创作者训练营第5期,点击了解活动详情.

目前市面上的NodeJS Web框架众多,有express、koa、eggjs等。而本文要介绍的NestJS,是唯一一个使用并完全支持TypeScript的。所以如果你想使用TypeScript来开发Web后端,就一起来学习NestJS吧!

NestJS之HelloWorld

安装脚手架工具,创建项目

$ npm i -g @nestjs/cli
$ nest new project-name

安装完成后运行项目:

yarn run start
//或
yarn run start:dev  //开启热更新

image.png

基础代码研究

先看下项目目录: image.png

我们主要看src目录下的文件,这是存放业务代码的地方。如果你有后端基础,就会知道MVC架构。其中C就是Controller控制层,专门负责接收请求的。

在app.controller中可以看到,通过get方法请求localhost:3000/时,会由App控制器中的getHello方法处理。

但是,控制层的代码只负责接收请求,具体的业务逻辑往往由Service层负责。所以,getHello方法里面又调用了appServeice的方法:

截屏2022-08-07 下午3.51.31.png

appService的getHello方法简单明了,就是返回“Hello World"字符串,最终显示在页面上。

image.png

连接数据库

NestJS不限制某种数据库,我这里选择mysql.并且采用其内置的TypeORM来操作数据库。

对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中

npm install --save @nestjs/typeorm typeorm mysql2

安装完成后,在App.module中将TypeOrmModule引入进来,并配置数据库:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'root',
      password: 'root',
      database: 'test',
      entities: [],
      synchronize: true,//设置为true时会自动创建表结构,生产环境下设为false
    }),
  ],
})
export class AppModule {}

接下来,通过nest g resource user命令创建用户模块:

image.png

编辑user.entity文件:

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn() //表明id为自增主键
  id: number;

  @Column()
  username: string;

  @Column()
  password: string;
}

在app.module中引入user.entity,并在entities中配置User实体:

...
import { User } from './user/entities/user.entity';
...
@Module({
  imports: [
    TypeOrmModule.forRoot({
        ...
        entities: [User],
        ...
    }),
  ],

编辑user.module文件:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
})
export class UsersModule {}

通过forFeature方法,定义了user模块使用的是User实体对应的数据表。然后我们就可以在user.service中,通过装饰器注入UserResposity,从而实现访问数据库。

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
  ) {}

  findAll(): Promise<User[]> {
    return this.userRepository.find();
  }
}

此时重启项目后查看数据库,你会发现数据库中自动创建了一张user表.这就是前面配置数据库时将synchronize设为true的结果。所以在生产环境一定要改成false,否则可能会造成数据丢失。

image.png

通过接口查询数据库

接下来我们通过接口访问获取用户表。在之前通过nest g resource user创建user模块时,已经在user.controller默认生成了增删改查的接口:

image.png

可以直接访问localhost:3000/user

image.png

总结

本文主要介绍了如何创建NestJS项目,如何建立数据库连接,还有如何通过接口获取用户列表数据。通过这个实战案例,可以对NestJS有一个初步的了解。我们会发现开发中涉及到了装饰器、依赖注入、ORM等知识点,这些都是值得深入研究的课题。

好了,以上就是本文的全部内容,水平有限,欢迎指教~

参考资料:

nestjs.com/

juejin.cn/post/703207…