nest.js + typeORM:基本使用

前言

nest是一款兼容typescript和javascript的node.js框架.本文使用nest的一些基本模块,来搭建一个简单的web后端CURD应用程序。typeORM是一款比较成熟的对象关系映射器,它是由typescript写的。nesttypeORM的具体介绍,可以查看官方文档。

项目搭建

使用CLI搭建project:

 npm i -g @nestjs/cli
 nest new nest-app

这样就创建了一个nest-app项目,创建完成后,在src文件夹中包含以下几个核心文件:

src
├── app.controller.ts
├── app.module.ts
└── main.ts

main.ts问项目启动文件,默认监听端口3000,根模块app.module.ts,路由实例app.controller.ts.

现在执行以下命令运行项目:

npm run start

启动后,在浏览器中输入localhost:3000,可以看到Hello world.

typeORM的使用

安装typeorm:

npm install --save @nestjs/typeorm typeorm mysql

typeorm支持多种数据库,本项目使用的是mysql。

创建实体employee和company,文件目录:

entities
├── employee.entity.ts
├── company.entity.ts

  

import { Entity, Column, PrimaryGeneratedColumn, ManyToOne, JoinTable } from ‘typeorm‘;
import { Company } from ‘./company.entity‘
@Entity()
export class Employee {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @Column()
    age: number

    @Column()
    address: string

    @ManyToOne(type => Company, company => company.employees, { cascade: true })
    @JoinTable()
    company: Company
}

company.entity.ts:

import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from ‘typeorm‘;
import { Employee } from ‘./employee.entity‘
@Entity()
export class Company {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @OneToMany(type => Employee, employee => employee.company)
    employees: Employee[]
}

在typeorm中都是通过装饰器来指定对象映射关系,本项目实体中目前主要使用仅使用了自增长主键,数据列,一对多关系等基本功能,在定义实体对象之间的关系时,关系一定要清楚,本例使用了cascade,可以用于级联删除级联保存操作。注意:级联删除和级联保存仅在save()时会生效,在insert()时无效。

创建employee模块

employee
├── employee.controller.ts
├── employee.module.ts
└── employee.service.ts

employee.service.ts:

import { Injectable } from ‘@nestjs/common‘;
import { Employee } from ‘../entities/employee.entity‘
import { InjectRepository } from ‘@nestjs/typeorm‘;
import { Repository } from ‘typeorm‘;
import { Company } from ‘../entities/company.entity‘

@Injectable()
export class EmployeeService {

    constructor(@InjectRepository(Employee)
    private readonly employeeRepository: Repository<Employee>) { }
    root(): string {
        return ‘Hello World!‘;
    }
    async create(): Promise<string> {
        let employee = new Employee();
        let company = new Company();
        company.name = ‘asc‘;
        employee.name = ‘novak‘;
        employee.age = 20;
        employee.address = ‘shanghai‘;
        employee.company = company;

        return this.employeeRepository.save(employee)
            .then(res => {
                return ‘create employee ...done‘
            })
            .catch(err => {
                return err
            });
    }

    async findOne(name: string): Promise<Employee> {
        return await this.employeeRepository.findOne({ name: name });
    }
}
employee.controller.ts: 

import { Get, Controller,Param } from ‘@nestjs/common‘;

import { EmployeeService } from ‘./employee.service‘;

import { Employee } from ‘entities/employee.entity‘;

@Controller(‘employee‘)

export class EmployeeController {

constructor(private readonly employeeService: EmployeeService) {}

@Get()

root():string{

console.log(123)

return this.employeeService.root();

}

@Get(‘findOne/:name‘)

async findOne(@Param() params):Promise<Employee>{

console.log(params.name);

return this.employeeService.findOne(params.name);

}

@Get(‘create‘)

async create():Promise<string>{

console.log(‘1323‘)

return this.employeeService.create();

}

}

employee.module.ts:

import { Module } from ‘@nestjs/common‘;
import { TypeOrmModule } from ‘@nestjs/typeorm‘;
import { EmployeeController } from ‘./employee.controller‘
import { EmployeeService } from ‘./employee.service‘
import { Employee } from ‘../entities/employee.entity‘

@Module({
    imports: [TypeOrmModule.forFeature([Employee])],
    providers: [EmployeeService],
    controllers: [EmployeeController]
})
export class EmployeeModule {

}
在employee.module.ts中TypeOrmModule.forFeature()是用于动态获取模块对象。在employee.controller.ts使用了基本的路由配置方式。

模块注入,数据库连接信息配置

在根目录中注入employee模块:

import { Module } from ‘@nestjs/common‘;
import { AppController } from ‘./app.controller‘;
import { AppService } from ‘./app.service‘;
import { TypeOrmModule } from ‘@nestjs/typeorm‘;
import {EmployeeModule} from ‘./employee/employee.module‘

@Module({
  imports: [
    TypeOrmModule.forRoot(),
    EmployeeModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule { }

可以看到,在imports中使用typeormmodule.forRoot()用于动态返回typeormmodule,typeormmodule连接数据库的方式有多种,可以使用配置文件,也可以在forRoot()中传入options参数信息,本例使用配置文件,在src目录下添加ormconfig.json文件:

{
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "root",
    "database": "nest-app",
    "entities": ["src/**/**.entity{.ts,.js}"],
    "synchronize": true
  }

至此一个基本的带有employee的创建和查询功能的service程序已搭建完毕,浏览器输入:localhost:3000/employee/create看看效果吧。

源码github

欢迎小伙伴多来交流!^_^

原文地址:https://www.cnblogs.com/novak12/p/9249688.html

时间: 2024-08-30 16:59:16

nest.js + typeORM:基本使用的相关文章

nest.js + typeORM:身份认证,事务管理

知识点 jwt身份认证 md5加密 typeorm事务(transaction)的使用 本文会延续上一篇文章,继续实现login功能,并实现API的身份认证,查看全部源码. JWT身份认证 对与绝大多数应用程序来说,身份认证是必不可少的组成部分,而对用户的身份认证授权的策略和方法非常多,选用何种方法取决于项目的需求. passport是node.js中的一个比较流行的认证库,本项目Demo会使用passport-jwt策略来实现用户身份认证. JWT(Json Web Token)是一种用于双方

[Next] Next.js+Nest.js实现GitHub第三方登录

GitHub OAuth 第三方登录 第三方登录的关键知识点就是 OAuth2.0 . 第三方登录,实质就是 OAuth 授权 . OAuth 是一个开放标准,允许用户让第三方应用访问某一个网站的资源,而不需要提供账号和密码. 总体就是:myapp <===> user <===> github 授权的总体流程 用户进入到我的网站,我想要获取到用户的 GitHub 信息 跳转到 GitHub 授权页面,然后问用户是否允许我获得他的信息,授予权限 同意,我的网站会获得 GitHub

Nest.js WebSocket

Docs: https://docs.nestjs.com/websockets/gateways λ yarn add @nestjs/websockets λ nest g ga events events.gateway.js import { SubscribeMessage, WebSocketGateway, WsResponse, WebSocketServer } from '@nestjs/websockets'; import { Observable, of } from

Notadd 2.0 全新 Node.js 版本~ (开发中) [从 PHP 到 node 的踩坑记]

对于 Notadd 我们本来期望它实现更多... 尽管我们也尝试做了很多努力,但是由于 PHP 本身的局限,以及考虑到开发环境配置的复杂程度,最终使用了折中方案.接下来,我们谈谈整个技术选型历程,也供今后相关开发者做借鉴和参考: 起因 我们期望 Notadd 不仅能应用到 web 领域,在嵌入式开发领域也能有所应用,同时能够使用常用的 websocket 协议. Swoole swoole 是我们考虑的首选方案,但从扩展性来说,难以符合我们模块化的要求,对 HTTPS 和 HTTP2 支持不够完

毕业两年后的迷茫

16年毕业之后回老家待了2年.西北三四线城市.2年内android.web前端(html.js.css+MUI/HUI).javaspring.node(express),工资始终4000左右.而且面临的是拖欠.乱扣. 最近意识到自己实在井底之蛙,想去外边学习.来到了西安.面了几家.都被刷了(web前端.java.node都面了).朋友是做招聘额.他直言我的技术太差.于是匆忙找了家写nestJS的,老板问我要多钱.我回了4k-5k(面试了三个问题1.aop的理解.2.mysql左联.3.nest

Nestjs Graphql

文档 工作示例 安装依赖: npm i --save @nestjs/graphql apollo-server-express graphql-tools graphql app.module.ts import { Module } from '@nestjs/common'; // import { AppController } from './app.controller'; import { AppService } from './app.service'; import { Gr

Node.js之Express一

前面也了解了HTTP模块,但它并不支持session.cookie等.Express是对HTTP模块的封装,同时也支持session这些,使用起来也更好用.Express更有点像IIS服务器.它也是属于一个模块的内容,所以当然是要先添加Express模块 npm install express.然后就是创建对象和使用. var express=require('express'); var app=experss(); 一.Express设置 Express提供了控制Express服务器的行为的

NEST 索引DataSet数据

NEST 索引DataSet数据,先序列化然后转成dynamic 类型进行索引: public void Insert(DataSet dataSet,int taskId) { StructureData(dataSet); foreach (DataTable table in dataSet.Tables) { string indexName = string.Format("mailtask{0}",taskId); string typeName = string.Form

Elasticsearch.net&amp;Nest 的使用

static void Main(string[] args) { Nest(); Console.WriteLine("End.."); Console.ReadKey(); //MyUser user = new MyUser(); //var indexResponse = lowlevelClient.Index<byte[]>("user", "guest", user.name, user); //byte[] respo