nextjs+nestjs+prisma写todolist全栈项目

技术栈

  • nextjs
  • nestjs
  • prisma

所学知识

  1. Nextjs组件渲染,状态,路由
  2. docker启动Mysql容器
  3. prisma操作Mysql(CRUD)
  4. 允许跨域请求API
  5. TanStack Query异步状态管理
  6. fetch api
  7. 服务器组件预请求数据
  8. nestjs 管道和异常处理
  9. 检测id是否正整数

Docker启动Mysql容器

compose.yml

name: 'todoList'
version: '3.8'
services:mysql:restart: alwayscontainer_name: todolistimage: mysql:8volumes:- ./mysql/datadir:/var/lib/mysql- ./mysql/config/my.cnf:/etc/mysql/my.cnfenvironment:- "MYSQL_ROOT_PASSWORD=root"- "TZ=Asia/Shanghai"ports:- 3306:3306

切换到compose.yml所在目录,cmd

docker-compose up

![[Pasted image 20241124230249.png]]

初始化prisma

npm install prisma --save-dev
npx prisma init

生成配置文件

设置数据库连接(mysql)

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-initgenerator client {provider = "prisma-client-js"
}datasource db {provider = "mysql"url      = env("DATABASE_URL")
}

设置数据库连接环境变量

DATABASE_URL="mysql://root:root@localhost:3306/todos?schema=public"
  • todos是数据库名

设置表

model Todo {id        Int      @id @default(autoincrement())title     Stringcompleted Boolean? @default(false)createdAt DateTime @default(now())
}
npx prisma migrate dev --name init

![[Pasted image 20241124221851.png]]

回到初始化状态(测试用)

会删除数据库数据但是prisma配置内容还在

npx prisma migrate reset

定义prisma client

npm install @prisma/client

Prisma Client 是一个类型安全的数据库客户端,它是从 Prisma 模型定义生成的。由于这种方法,Prisma Client 可以公开专门为您的模型量身定制的 CRUD 操作。

请注意,在安装过程中,Prisma 会自动为您调用 prisma generate 命令。将来,您需要在每次更改 Prisma 模型后运行此命令,以更新生成的 Prisma Client。

使用prisma client

prisma.service.ts


import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {async onModuleInit() {await this.$connect();}
}

onModuleInit 是可选的 — 如果你省略它,Prisma 将在第一次调用数据库时延迟连接。

注意

app.module要引入PrismaService

import { Module } from '@nestjs/common';
import { PrismaService } from 'src/prisma.service';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TodoController } from './todo/todo.controller';
import { TodoService } from './todo/todo.service';@Module({imports: [],controllers: [AppController, TodoController],providers: [AppService, TodoService, PrismaService],
})
export class AppModule {}

不然报错

prisma调用数据库操作

接下来,您可以编写可用于从 Prisma 架构对 todo模型进行数据库调用的服务。

import { Body, Controller, Get, Post } from '@nestjs/common';
import { TodoService } from 'src/todo/todo.service';@Controller('todo')
export class TodoController {constructor(private readonly todoService: TodoService) {}@Post()async createTodo(@Body() createTodoDto: any) {return this.todoService.createTodo(createTodoDto);}
}
import { Injectable } from '@nestjs/common';
import { PrismaService } from 'src/prisma.service';@Injectable()
export class TodoService {constructor(private prisma: PrismaService) {}async createTodo(data: any) {const todo = await this.prisma.todo.create({data: {title: data.title,completed: false,},});return todo;}
}
  • private

这确保了封装,这意味着没有其他类或外部代码可以直接访问 todoService 属性,这是维护干净且可预测的代码的良好做法。

  • readonly

这是有益的,因为服务实例应在控制器的整个生命周期中保持不变。它可以防止意外重新分配 todoService 属性,这可能会导致 bug。

  @Delete(':id')async deleteTodoById(@Param('id') id: string) {return this.todoService.deleteTodoById(+id);}
async getTodoById(id: number

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

矩阵的拼接

矩阵的拼接分为横向拼接和纵向拼接 注意:横向拼接要求两矩阵行数相同,纵向拼接要求两矩阵列数相同 h o r z c a t horzcat horzcat和 v e r t c a t vertcat vertcat函数 h o r z c a t ( a , b ) horzcat(a,b) horzcat(a,b)将 a a a和 b b b横向拼接&a…

决策树——基于乳腺癌数据集与cpu数据集实现

决策树——乳腺癌数据实现 4.1 训练决策树模型,并计算测试集的准确率 1. 读入数据 from sklearn import datasets from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix …

【ruby on rails】dup、deep_dup、clone的区别

一、区别 dup 浅复制:dup 方法创建对象的浅复制。 不复制冻结状态:dup 不会复制对象的冻结状态。 不复制单例方法:dup 不会复制对象的单例方法。 deep_dup 深复制:deep_dup 方法创建对象的深复制,递归复制嵌套的对象。…

PyTorch:神经网络的基本骨架 nn.Module的使用

神经网络的基本骨架 nn.Module的使用 为了更全面地展示如何使用 nn.Module 构建一个适用于现代图像处理任务的卷积神经网络(CNN),我们将设计一个针对手写数字识别(如MNIST数据集)的简单CNN模型。CNN非常适合处理图像数…

Java中使用FFmpeg拉取RTSP流

在Java中使用FFmpeg拉取RTSP流并推送到另一个目标地址是一个相对复杂的任务,因为Java本身并没有直接处理视频流的功能。但是,我们可以借助FFmpeg命令行工具来实现这个功能。FFmpeg是一个非常强大的多媒体处理工具,能够处理音频、视频以及其他…

【Qt】重写QComboBox下拉展示多列数据

需求 点击QComboBox时&#xff0c;下拉列表以多行多列的表格展示出来。 实现 直接上代码&#xff1a; #include <QComboBox> #include <QTableWidget> #include <QVBoxLayout> #include <QWidget> #include <QEvent> #include <QMouseEve…

windows C#-使用反射访问特性

你可以定义自定义特性并将其放入源代码中这一事实&#xff0c;在没有检索该信息并对其进行操作的方法的情况下将没有任何价值。 通过使用反射&#xff0c;可以检索通过自定义特性定义的信息。 主要方法是 GetCustomAttributes&#xff0c;它返回对象数组&#xff0c;这些对象在…

七牛云AIGC内容安全方案助力企业合规创新

随着人工智能生成内容(AIGC)技术的飞速发展,内容审核的难度也随之急剧上升。在传统审核场景中,涉及色情、政治、恐怖主义等内容的标准相对清晰明确,但在AIGC的应用场景中,这些界限变得模糊且难以界定。用户可能通过交互性引导AI生成违规内容,为审核工作带来了前所未有的不可预测…

《物联网智能项目》

一、引言 随着科技的不断进步&#xff0c;物联网&#xff08;Internet of Things&#xff0c;IoT&#xff09;已经成为当今世界最具发展潜力的领域之一。物联网智能项目通过将各种设备、传感器和系统连接到互联网&#xff0c;实现了智能化的监测、控制和管理&#xff0c;为人们…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…

什么是JSON,有什么特点

什么是 JSON&#xff1f; JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。它基于 JavaScript 的子集&#xff0c;但独立于语言&#xff0c;被广泛用于服务器与 Web 应…

数据结构 (8)线性表的应用——一元多项式的表示及应用

一、一元多项式的定义 一元多项式是代数学研究的基本对象之一&#xff0c;可以表示为&#xff1a; P_n(x) p_0 p_1x p_2xn 其中&#xff0c;p_0, p_1, ..., p_n 是数域 F 中的数&#xff0c;n 是非负整数&#xff0c;x 是变量。 二、一元多项式的线性表表示 在计算机中&…

如何安全高效地打开和管理动态链接库(DLL)?系统提示dll丢失问题的多种有效修复指南

动态链接库&#xff08;DLL&#xff09;文件是Windows操作系统中非常重要的一部分&#xff0c;它们包含了程序运行所需的代码和数据。当系统提示DLL文件丢失时&#xff0c;可能会导致应用程序无法正常运行。以下是一些安全高效地打开和管理DLL文件以及修复DLL丢失问题的方法&am…

缓存方案分享

不知道大家平常更新缓存是怎么做的&#xff0c;但是大部分时候都是更新数据的同时更新缓存&#xff0c;今天和同事一起聊到一个缓存方案的问题&#xff0c;感觉很有趣、非常精妙&#xff0c;记录一下。 基于此本文将介绍几种常见的缓存更新策略&#xff0c;包括简单的缓存覆盖…

基于微信小程序的平价药房管理系统+LW参考示例

1.项目介绍 系统角色&#xff1a;管理员、医生、普通用户功能模块&#xff1a;用户管理、医生管理、药品分类管理、药品信息管理、在线问诊管理、生活常识管理、日常提醒管理、过期处理、订单管理等技术选型&#xff1a;SpringBoot&#xff0c;Vue&#xff0c;uniapp等测试环境…

鸿蒙ArkUI-X已更新适配API13啦

ArkUI-X 5.0.1 Release版配套OpenHarmony 5.0.1 Rlease&#xff0c;API 13&#xff0c;新增适配部分API 13接口支持跨平台&#xff1b;框架能力进一步完善&#xff0c;支持Android应用非压缩模式&#xff0c;支持Android Fragment对接跨平台。ACE Tools工具易用性提升&#xff…

图片预览 图片上传到服务器

首先要明白 理解 multipart/form-data&#xff1a;‌multipart/form-data是一种在HTTP请求中使用的MIME类型&#xff0c;主要用于在客户端和服务器之间传输包含文件或二进制数据的表单数据。它通过一个边界&#xff08;boundary&#xff09;来分隔不同的表单字段和文件数据‌。…

京准电钟:NTP网络校时服务器从入门到精准

京准电钟&#xff1a;NTP网络校时服务器从入门到精准 京准电钟&#xff1a;NTP网络校时服务器从入门到精准 1.前言 由计算机网络系统组成的分布式系统&#xff0c;若想协调一致进行&#xff1a;IT行业的“整点开拍”、“秒杀”、“Leader选举”&#xff0c;通信行业的“同步…

《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人

课程 《生成式 AI》课程 第3講&#xff1a;訓練不了人工智慧嗎&#xff1f;你可以訓練你自己-CSDN博客 任务1:总结 1.我们希望你创建一个可以执行文章摘要的机器人。 2.设计一个提示符&#xff0c;使语言模型能够对文章进行总结。 model: gpt-4o-mini,#gpt-3.5-turbo, import…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…