当前位置: 首页 > news >正文

nextjs项目中,使用postgres的完整案例

目的

通过此案例,可以简单快速的过一下数据库的操作,熟悉app-router这种模式下,client component和server component的两种组件中基本的接口使用。

技术栈

  • nextjs@14.2.* app-router
  • @vercel/postgres@0.10.*
  • typescript@5

重要事情说三遍1

  • app-router!!! 下面所有的代码和目录结构,脱离不开这个模式
  • app-router!!! 下面所有的代码和目录结构,脱离不开这个模式
  • app-router!!! 下面所有的代码和目录结构,脱离不开这个模式

创建表

初始化操作,可以看 最新nextjs中使用postgresSQL 这里

sql语句:CREATE TABLE article (content TEXT);

创建一个存放文章内容的表,字段为content 并且类型为TEXT. 详细的数据类型可以看这里

字符类型描述
character varying(n), varchar(n)变长,有长度限制
character(n), char(n)定长,不足补空白
text变长,无长度限制

创建文章数据(服务端)

sql语句:INSERT INTO article VALUES (${body.content});

接口文件:src/api/add-acticle/route.ts

import { sql } from '@vercel/postgres';
import { NextResponse } from 'next/server';export async function GET() {const { rows } = await sql`SELECT * FROM article`;return Response.json({ rows })
}export async function POST(request: Request) {const body = await request.json();await sql`INSERT INTO article VALUES (${body.likes});`;return NextResponse.json({ status: 200 });
}

创建文章数据(客户端)

目录:src/app/components/create-comp/index.tsx
涉及到react hook使用的组件,必须是use client

  • 以下出现的gyp-gao-ui组件库已发布到npm,如果只是想demo下,自行npm i -S gyp-gao-ui即可,使用中出现问题,可以看 nextjs中集成富文本编辑器wangEditor
  • 或者就是换成随便一个输入框
  • getHostStatic 方法的代码
    在这里插入图片描述
"use client";
import { RichText } from "gyp-gao-ui"; 
import { useState } from "react";
import { getHostStatic } from '../../../utils/static-index';export default function CreateText() {const [data, setData] = useState('');const handleInsert = async () => {const res = await fetch(`${getHostStatic()}/api/add-acticle`,{method: "post",body: JSON.stringify({content: data,}),});// 这里res可以自己在服务端那边组装成想要的格式哦// 然后前端这边就自行根据不同的结果做一些正常/异常处理};const handleChange = (value: string) => {setData(value);}return (<div><RichText onChange={handleChange} /><div className="btn" onClick={handleInsert}>保存数据</div></div>);
}

目录:src/app/create/page.tsx
主创建页面,服务端渲染的

import dynamic from 'next/dynamic'
import { Metadata } from 'next';
import './a.scss'; // 天然支持的scss/sassconst RichText = dynamic(() => import("../components/create-comp"), {ssr: false,
});export const metadata: Metadata = {title: '创建数据',
}export default async function CreateText() {return (<div className='a'><RichText /></div>);
}

查询展示文章数据 (客户端)

服务端数据生成和渲染

  • getHost 方法代码如下,切记该代码的运行环境不能是use client
    目录:src/utils/index.ts

服务端怎么知道当前项目的域名,通过headers上面的字段查询,官方文档

import { headers } from 'next/headers';const logPrefix = '[blog-render]:--> '
/** 获取当前域名 */
export const getHost = () => {const headersList = headers();// https://developer.mozilla.org/docs/Web/API/Headers/get// https://nextjs.org/docs/app/api-reference/functions/headersconst host = headersList.get('host');const xForwardedHost = headersList.get('x-forwarded-host');const referer = headersList.get('referer');const protocol = headersList.get('x-forwarded-proto');console.info(logPrefix + 'url:===', host, referer, protocol)// 获取协议const realProtocol = referer?.split('://')[0] || protocol;const realHost = host || xForwardedHost;console.info(logPrefix + 'realUrl:==', realProtocol, realHost)const url = `${realProtocol}://${realHost}`;return url;
}

目录:src/app/components/pre-comp/index.tsx

"use client";
import { RichTextRender } from "gyp-gao-ui";export default function Preview({ content }: {content: string}) {return (<div style={{marginBottom: '30px'}}><RichTextRender content={content} /></div>);
}

目录:src/app/preview/pages.tsx

import { Metadata } from 'next';
import dynamic from 'next/dynamic';
import { getHost } from '../../utils';export const metadata: Metadata = {title: '欢迎预览',}const RichTextReader = dynamic(() => import("../components/pre-comp"), {ssr: false,
});export default async function Preview() {const url = getHost();const data = await fetch(`${url}/api`);const { rows } = await data.json();return (<div>{rows.map((o: { content: string }, i: number) => <RichTextReader key={i} content={o.content} />)}</div>)
}

效果如下

列表数据展示如下,当然demo就不写那么美观的css了!
在这里插入图片描述

写在最后

找到正确的打开入口,学习就会事半功倍,觉醒吧前端同志。记得给博主点个赞,制作不易,感谢大家捧场!!!


  1. 还是希望大家,可以多多评论区讨论 ↩︎

相关文章:

nextjs项目中,使用postgres的完整案例

目的 通过此案例&#xff0c;可以简单快速的过一下数据库的操作&#xff0c;熟悉app-router这种模式下&#xff0c;client component和server component的两种组件中基本的接口使用。 技术栈 nextjs14.2.* app-routervercel/postgres0.10.*typescript5 重要事情说三遍1 ap…...

tsconfig.json 内容解读

tsconfig.json 文件是 TypeScript 项目的主要配置文件&#xff0c;用于指定编译选项和项目设置。通过这个文件&#xff0c;你可以控制编译器的行为&#xff0c;例如输出文件的路径、模块解析方式、严格类型检查等。 以下是一些常见的 tsconfig.json 属性及其详细解释&#xff…...

KClass-关于kotlin中的反射

override val responseType: KClass<SetOperationModeResponse> SetOperationModeResponse::class,这段代码的含义&#xff1a; responseType 是一个只读属性&#xff08;val&#xff09;&#xff0c;它的类型是 KClass<SetOperationModeResponse>。KClass<T&…...

Java集合剖析2】Java集合底层常用数据结构

一、数据结构与集合 接下来就要学习集合具体的实现类了&#xff0c;集合的实现类底层可能用1种或多种数据结构来存储数据。所以在学习集合的实现类前&#xff0c;我们有必要了解一下一些常见的数据结构&#xff0c;这样我们在后面查看集合实现类的底层源码时&#xff0c;才不会…...

java 第10天 String创建以及各类常用方法

一.String创建的两种形式 1.通过new的当时 String strnew String(); 2.不new的方式 String s1""; 二.new 和不new的方式的区别是什么 不new创建的字符串首先是拿着值去常量池中查找&#xff0c;是否有该内容&#xff0c;有就用常量池该字符串的地址&#xff0…...

VS 解决方案里面.vs文件夹

VS解决方案中的.vs文件夹主要用于存储当前用户在解决方案中的工作配置。 这些配置包括多个方面&#xff1a; 窗口布局和选项卡状态&#xff1a;.vs文件夹记录了VS关闭前最后的窗口布局以及最后打开的选项卡。这样&#xff0c;当用户重新打开解决方案时&#xff0c;可以继续之前…...

初试PostgreSQL数据库

文章目录 一、PostgreSQL数据库概述1.1 PostgreSQL的历史1.2 PostgreSQL安装1.3 安装PostgreSQL二、PostgreSQL起步2.1 连接数据库2.1.1 SQL Shell2.1.2 执行SQL语句2.2 pgAdmin 42.2.1 打开pgAdmin 42.2.2 查找数据库2.2.3 打开查询工具2.2.4 执行SQL语句三、实战小结文章目录…...

springboot3导出数据库数据到excel

一、导入依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.3.0</version></dependency><d…...

十四、行为型(观察者模式)

观察者模式&#xff08;Observer Pattern&#xff09; 概念 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了对象间的一对多依赖关系&#xff0c;当被观察的对象&#xff08;主题&#xff09;状态发生改变时&#xff0c;所有依赖…...

爬取简书1

import osfrom selenium.webdriver.common.by import By from selenium import webdriver from selenium.webdriver.edge.service import Service import timeimport pandas as pdfrom selenium.webdriver.common.action_chains import ActionChainsdef get_aws():# 如果 WebDr…...

基于STM32单片机设计的矿山环境作业安全监测系统

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】需求总结1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 模块的技术详情介绍【1】BC26-NBIOT模块【2】DHT11温湿度模块【3】PM2.5粉尘模块二…...

大数据linux操作系统

第一关&#xff1a;Linux的初体验 答案&#xff1a; cd / ls -a / &#xff08;里面有空格要注意&#xff09; 第二关&#xff1a;Linux的常用命令 答案&#xff1a; touch newfile mkdir newdir cp newfile newdir/newfileCpy 第三关&#xff1a;Linux查询命令帮助语句…...

MySQL 【日期】函数大全(七)

目录 1、UNIX_TIMESTAMP() 将指定的日期/日期时间转为 UNIX 时间戳值。 2、WEEK() 返回给定日期位于当年的第几周。 3、WEEKDAY() 返回给定日期的工作日编号。 4、WEEKOFYEAR() 返回给定日期位于当年的第几周 5、YEAR() 提取日期的年份部分并作为数字返回。 6、YEARWEEK()…...

IP报文格式、IPv6概述

IPv4报文格式 IPv4报文首部长度至少为20字节(没有可选字段和填充的情况下)&#xff0c;下面来逐一介绍首部各个字段的含义 Version版本&#xff1a;表示采用哪一种具体的IP协议&#xff0c;对于IPv4来说该字段就填充4以表示&#xff0c;如果是IPv6就填充6IHL首部长度&#xff…...

学习记录:js算法(六十七):任务调度器

文章目录 任务调度器思路一思路二 任务调度器 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表&#xff0c;用字母 A 到 Z 表示&#xff0c;以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成&#xff0c;但有一个限制&#xff1a;两个…...

5分钟8图:Cursor如何让编程效率提升5倍?

5分钟8图&#xff0c;看Cursor如何革新AI编程? 作为一名AI编程的实践者,我很高兴为大家介绍Cursor - 一款基于VSCode的创新型集成开发环境(IDE),它巧妙地融合了先进的AI技术,为编程工作带来前所未有的便利。让我们通过多个图表深入了解Cursor的特性和工作流程。 Cursor的核心…...

车载实操:一对一实操学习、CANoe实操学习、推荐就业机会、就业技术支持、协助面试辅导

FOTA模块中OTA的知识点&#xff1a;1.测试过程中发现哪几类问题&#xff1f; 可能就是一个单键的ecu&#xff0c;比如升了一个门的ecu&#xff0c;他的升了之后就关不上&#xff0c;还有就是升级组合ecu的时候&#xff0c;c屏上不显示进度条。 2.在做ota测试的过程中&#xff…...

PACT 在微服务架构中的用途

在微服务架构盛行的今天&#xff0c;如何确保各个微服务之间的交互正确且稳定成为了一个关键问题。PACT&#xff08;一种契约测试工具&#xff09;在这个领域发挥着重要的作用。那么&#xff0c;PACT 在微服务架构中的用途到底是什么呢&#xff1f; 一、微服务架构的挑战 微服…...

LeetCode 3200.三角形的最大高度:枚举

【LetMeFly】3200.三角形的最大高度&#xff1a;枚举 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximum-height-of-a-triangle/ 给你两个整数 red 和 blue&#xff0c;分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形&#xff0c;满足第 1 行…...

ssm基于java的招聘系统设计与开发+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目 录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 1 第2章 开发环境与技术 3 2.1 Java语言…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...