基于NestJS 和 TypeORM 实现 CURD RESTful API接口

前言

对于服务端项目而言,对外如何提供合格规范的HTTP接口,对内如何优雅的操作数据存储,比如mysql、mongodb。

本文是NestJS服务端开发的基础入门教程,我会根据成熟的解决方案,给大家详细介绍如何基于NestJS实现开发RESTful API,其中基于TypeORM操作mysql数据的增删改查。

希望通过阅读完这篇文章后零基础的朋友也能够完成简单的服务端项目开发。

准备工作

1. 安装依赖

为了方便对mysql进行操作,ORM工具是必不可少的。TypeORM对NestJS有良好的支持,同是对TypeScript 也有极好的支持,所以首先安装好必要的依赖包;

npm install @nestjs/typeorm typeorm mysql2

2. 导入 TypeOrmModule

在项目模块中导入TypeORM模块,并且将mysql连接信息按照下方模块正确填写;

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

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'username',
      password: 'password',
      database: 'databaseName',
      autoLoadEntities: true,
      synchronize: true,
			logging: ["query"]
    }),
  ],
})
export class AppModule {}

3. 创建数据库表实体

TypeORM 的目的是开发者不需要直接面对SQL语句,只需要通过TypeORM提供的API就能够完成对数据库表数据的增删改查。

TypeORM中通过entity对象与数据库的表一一对应。例如本文我们实现对 article 数据表的各种操作。

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

@Entity()
export class Article {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  title: string;

  @Column()
  content: string;

  @Column({ default: true })
  isPublish: boolean;
}

4. 加载数据库实体

步骤3定义好了article对象,接下来需要将它注册到TypeORM

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Article } from './models/article';

@Module({
  imports: [
    TypeOrmModule.forRoot({
     ...
    }),
    TypeOrmModule.forFeature([Article])
  ],
})
export class AppModule {}

5. 项目启动

项目启动后,从控制台输出的日志可以看到article表创建的日志,说明已经成功初始化了TypeORM

Untitled.png

通过Navicat查询article表也成功创建了

Untitled.png

至此,所有的准备工作已经完成。接下来我们基于TypeORM完成CURD操作。

开始编写 CURD RESTful API

💡 REST API 定义了一组标准的方法来操作资源(比如 GET, POST, PUT, DELETE)。

新建 ArticleController 用于处理 article数据的增删改查。

完成HTP接口代码后,然后通过Postman进行接口调试。

import { InjectRepository } from '@nestjs/typeorm';
import {
  Controller,
  Get,
  Query,
  Header,
  Res,
  Post,
  Delete,
  Param,
  Put,
  Body,
} from '@nestjs/common';
import { Article } from './models/article';
import { Repository } from 'typeorm';

@Controller('/api/article')
export class ArticleController {
  @InjectRepository(Article)
  private readonly articleRepository: Repository<Article>;

 
}

一、增

通过articleRepository的save方法新增数据

@Controller('/api/article')
export class ArticleController {
  @InjectRepository(Article)
  private readonly articleRepository: Repository<Article>;

  @Post()
  async createArticle() {
    const article = await this.**articleRepository.save**({
      title: '文章名称',
      content: '内容内容内容内容内容',
      isPublish: true,
    });
    return article;
  }
}

Untitled.png

Untitled.png

二、删

通过articleRepository的delete方法删除数据

@Controller('/api/article')
export class ArticleController {
  @InjectRepository(Article)
  private readonly articleRepository: Repository<Article>;

  @Delete('/:id')
  async deleteArticle(@Param() params) {
    const { id } = params;
    await this.**articleRepository.delete**({ id });
    return 'ok';
  }
}

Untitled.png

三、改

通过articleRepository的update方法新增数据

@Controller('/api/article')
export class ArticleController {
  @InjectRepository(Article)
  private readonly articleRepository: Repository<Article>;

  @Put()
  async updateArticle(@Body() body) {
    const { id, title } = body;
    await this.**articleRepository.update**({ id }, { title });
    return 'ok';
  }
}

Untitled.png

Untitled.png

四、查

通过articleRepository的find方法查询数据

@Controller('/api/article')
export class ArticleController {
  @InjectRepository(Article)
  private readonly articleRepository: Repository<Article>;

  @Get()
  async getArticle() {
    const articles = await this.**articleRepository.find**();
    return articles;
  }
}

Untitled.png

总结

本文基于Nestjs和TypeORM实现了最基础的CURD接口,也提供了对应的实战代码和效果截图,希望能够帮助到有需要的朋友。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/260728.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

中国激光雷达的2023:倔强的笨小孩

作者 |David 编辑 |王博 现在回头来看&#xff0c;从2007年莱万多夫斯基和大卫霍尔在硅谷骑着摩托车四处兜售激光雷达开始&#xff0c;到2023年仅中国车载市场出货量接近60万&#xff0c;覆盖了市面上40%以上搭载高阶智驾的新车型&#xff0c;激光雷达一直在用有力的数据回应着…

华为atlas300安装教程

1、安装包位置&#xff1a; /data/ai_install_packages 2、添加HwHiAiUser用户&#xff1a; groupadd -g 1000 HwHiAiUser useradd -g HwHiAiUser -u 1000 -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash 3、安装驱动&#xff1a; ./Ascend-hdk-310p-npu-driver_6.0.0_l…

HashMap扩容是2倍的原因(全网博客几乎都解释错了)

零、前言 最近在写博客时&#xff0c;突然又想起来哪个经常出现在面试题里的问题&#xff1a; HashMap扩容为什么是原来的2倍&#xff1f; 因为看过源码&#xff0c;我觉得这个问题并不难。在我之前的通俗解释equals和hashCode的关系和作用里也说过这个原因。但为了博客的严谨…

DesignDoll使用方法

选择材质球 取消网格线 控制手部动作-设置左右手 - 手部运动 控制身材 控制身高 比例

第三节TypeScript 基础类型

1、typescript的基础类型 如下表&#xff1a; 数据类型 关键字 描述 任意类型 any 生命any的变量可以赋值任意类型的值 数字类型 number 整数或分数 字符串类型 string 使用单引号&#xff08;‘’&#xff09;或者双引号&#xff08;“”&#xff09;来表示字符串…

RESTful简介与C/C++实现

一、RESTful简介 RESTful&#xff0c;全称为Representational State Transfer&#xff0c;是一种软件架构风格和设计理念&#xff0c;而不是一种标准。它主要用于Web服务的设计和开发&#xff0c;强调资源的状态表示和状态转移。RESTful风格的设计使得Web服务更加简洁、清晰和…

页面菜单,通过get请求一个url后,跳转另外一个页面,+丢失问题

业务场景描述&#xff1a; 在A系统&#xff0c;菜单点击跳B系统这个操作。 A系统菜单是get请求到B系统的一个缓冲页面&#xff0c;然后这个缓冲页面获取到url中的accessToken后&#xff0c;在这个页面中通过post请求后端接口。 问题描述&#xff1a; 当accessToken中包含了…

MongoDB 单机安装部署

文章目录 说明1. 下载安装包2. 安装数据库3. 配置 systemctl4. 创建 root 用户 说明 本篇文章介绍 MongoDB 二进制安装的步骤&#xff0c;整个过程还是比较简单。 1. 下载安装包 进入 MongoDB 官网&#xff0c;获取安装包的下载链接&#xff1a; https://www.mongodb.com/tr…

Leetcode—179.最大数【中等】

2023每日刷题&#xff08;六十五&#xff09; Leetcode—179.最大数 算法思想 实现代码 其中sort的lambda自定义排序策略参考自官方文档 class Solution { public:string largestNumber(vector<int>& nums) {string ans;vector<string> strs;for(auto num: …

mysql创建用户和赋权

1.创建用户 CREATE USER new_userlocalhost IDENTIFIED BY user_password; “localhost"只允许本地连接&#xff0c;而”%"允许所有IP地址都可以连接到服务器。 2.赋权 GRANT ALL PRIVILEGES ON database_name.* TO new_userlocalhost; FLUSH PRIVILEGES; 3.给…

Uniapp + Vue3 封装请求工具挂载全局

新建request.js工具类 const http {// baseUrl 地址baseUrl: http://localhost:8080,// 请求方法request(config) {// config&#xff1a;请求配置对象&#xff0c;具体参照uniapp文档config beforeRequest(config)// 请求地址拼接config.url this.baseUrl config.url// 异…

Linux Centos 配置 Docker 国内镜像加速

在使用 Docker 进行容器化部署时&#xff0c;由于国外的 Docker 镜像源速度较慢&#xff0c;我们可以配置 Docker 使用国内的镜像加速器&#xff0c;以提高下载和部署的效率。本文将介绍如何在 CentOS 系统上配置 Docker 使用国内镜像加速。 步骤一&#xff1a;安装 Docker 首…

最新时报!即将开业的新工厂将推出量产人形机器人

原创 | 文 BFT机器人 世界上第一个工厂批量生产的人形机器人即将在太平洋西北地区开业。 Agility Robotics首席执行官谢尔顿在一次采访中谈到&#xff0c;一旦达到“顶峰”&#xff0c;公司将在其“RoboFab”工厂生产10000个机器人&#xff0c;这就是量产的意思了&#xff0c;…

基础硬件、实施运维工程师与操作系统的介绍

目录 一、实施与运维 1.2 实施运维一般做什么 1.1.1实施工程师 1.1.2运维工程师 1.3 实施运维需要具备哪些技能 三、基础硬件 四、操作系统 4.1 Windows 4.2 Linux 4.3 macOS 4.4 Unix 五、总结 一、实施与运维 1.1 实施运维是干什么的 1、运维工程师负责服务的稳…

java 4.数组

文章目录 4.数组4.1数组的概念4.2 数组的定义4.3 数组的初始化4.4 数组下标的有效范围与常见异常4.5 数组内存分析4.6 二维数组4.6.1 创建二维数组4.6.2 二维数组的赋值4.6.3 多维数组4.6.4 通过二维数组输出不同版式的古诗 4.7 不规则数组4.8 数组的基本操作4.8.1 数组遍历4.8…

Leetcode 55 跳跃游戏

题意理解&#xff1a; 非负整数数组 nums, 最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 需要跳到nums最后一个元素即为成功。 目标&#xff1a;是否能够跳到最后一个元素。 解题思路&#xff1a; 使用贪心算法来解题&#xff0c;需要理解…

神经网络:激活函数层知识点

1.激活函数的作用&#xff0c;常用的激活函数有哪些 激活函数的作用 激活函数可以引入非线性因素&#xff0c;提升网络的学习表达能力。 常用的激活函数 Sigmoid 激活函数 函数的定义为&#xff1a; f ( x ) 1 1 e − x f(x) \frac{1}{1 e^{-x}} f(x)1e−x1​ 如下图…

推荐几个好用的开源无代码/低代码开发平台

一、什么是无代码/低代码开发 无代码/低代码开发是一种可视化的应用程序开发方法&#xff0c;使用具有拖放组件和模型驱动逻辑组合的图形界面。无代码/低代码开发试图降低从软件技术平台、产品和服务中提取价值的进入壁垒。低代码开发平台被称为可视化集成开发环境&#xff08…

美颜技术详解:深入了解视频美颜SDK的工作机制

本文将深入探讨视频美颜SDK的工作机制&#xff0c;揭示其背后的科技奥秘和算法原理。 1.引言 视频美颜SDK作为一种集成到应用程序中的技术工具&#xff0c;通过先进的算法和图像处理技术&#xff0c;为用户提供令人印象深刻的实时美颜效果。 2.视频美颜SDK的基本工作原理 首…