前端与数据库交互

1. 前端角色:发起请求和处理响应

前端主要负责:

  • 收集用户输入数据

  • 通过HTTP请求调用后端API

  • 处理响应并更新UI

2. 基础前端代码示例(使用Fetch API)

// API服务模块 class ApiService { constructor(baseURL) { this.baseURL = baseURL; } // 查询数据 async getItems() { try { const response = await fetch(`${this.baseURL}/api/items`); if (!response.ok) throw new Error('获取数据失败'); return await response.json(); } catch (error) { console.error('获取数据出错:', error); throw error; } } // 添加数据 async addItem(itemData) { try { const response = await fetch(`${this.baseURL}/api/items`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(itemData) }); if (!response.ok) throw new Error('添加失败'); return await response.json(); } catch (error) { console.error('添加数据出错:', error); throw error; } } // 更新数据 async updateItem(id, updateData) { try { const response = await fetch(`${this.baseURL}/api/items/${id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(updateData) }); if (!response.ok) throw new Error('更新失败'); return await response.json(); } catch (error) { console.error('更新数据出错:', error); throw error; } } // 删除数据 async deleteItem(id) { try { const response = await fetch(`${this.baseURL}/api/items/${id}`, { method: 'DELETE' }); if (!response.ok) throw new Error('删除失败'); return true; } catch (error) { console.error('删除数据出错:', error); throw error; } } } // 使用示例 const api = new ApiService('https://your-backend.com'); // 获取并显示数据 async function loadAndDisplayItems() { const items = await api.getItems(); // 更新UI显示数据 } // 添加新项目 async function handleAddItem() { const newItem = { name: document.getElementById('itemName').value, description: document.getElementById('itemDesc').value }; await api.addItem(newItem); await loadAndDisplayItems(); // 刷新数据 }

后端实现示例(Node.js + Express + MySQL)

了解后端如何实现可以帮助前端开发者更好地协作:

// 后端API示例 const express = require('express'); const mysql = require('mysql2/promise'); require('dotenv').config(); const app = express(); app.use(express.json()); // 创建数据库连接池(生产环境使用环境变量) const pool = mysql.createPool({ host: process.env.DB_HOST, user: process.env.DB_USER, password: process.env.DB_PASSWORD, database: process.env.DB_NAME, waitForConnections: true, connectionLimit: 10 }); // 获取所有项目 app.get('/api/items', async (req, res) => { try { const [rows] = await pool.execute('SELECT * FROM items'); res.json(rows); } catch (error) { console.error('数据库查询错误:', error); res.status(500).json({ error: '服务器内部错误' }); } }); // 添加新项目 app.post('/api/items', async (req, res) => { try { const { name, description } = req.body; // 数据验证 if (!name || !description) { return res.status(400).json({ error: '缺少必要字段' }); } const [result] = await pool.execute( 'INSERT INTO items (name, description) VALUES (?, ?)', [name, description] ); res.status(201).json({ id: result.insertId, name, description }); } catch (error) { console.error('数据库插入错误:', error); res.status(500).json({ error: '服务器内部错误' }); } }); // 更新项目 app.put('/api/items/:id', async (req, res) => { // ... 类似实现 }); // 删除项目 app.delete('/api/items/:id', async (req, res) => { // ... 类似实现 }); app.listen(3000, () => { console.log('服务器运行在 http://localhost:3000'); });

现代前端数据管理方案

1. 使用状态管理库

// 以React + TanStack Query为例 import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; function ItemList() { const queryClient = useQueryClient(); // 获取数据 const { data: items, isLoading } = useQuery({ queryKey: ['items'], queryFn: () => fetch('/api/items').then(res => res.json()) }); // 添加数据 const addMutation = useMutation({ mutationFn: (newItem) => fetch('/api/items', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(newItem) }).then(res => res.json()), onSuccess: () => { queryClient.invalidateQueries(['items']); // 刷新数据 } }); // 类似地实现更新和删除... }

2. 使用专门的HTTP客户端

  • Axios: 功能强大的HTTP客户端

  • SWR: React专用的数据获取库

  • RTK Query: Redux Toolkit的数据获取解决方案

实际项目中的最佳实践

1. 统一错误处理

// 错误处理中间件 const handleApiError = async (response) => { if (!response.ok) { const error = await response.json().catch(() => ({})); throw new Error(error.message || `HTTP错误: ${response.status}`); } return response.json(); }; // 使用示例 fetch('/api/items') .then(handleApiError) .then(data => console.log(data)) .catch(error => showErrorToast(error.message));

2. 请求拦截器(添加认证等)

// Axios示例 axios.interceptors.request.use(config => { const token = localStorage.getItem('auth_token'); if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }); // 响应拦截器处理常见错误 axios.interceptors.response.use( response => response, error => { if (error.response?.status === 401) { // 跳转到登录页 window.location.href = '/login'; } return Promise.reject(error); } );

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

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

相关文章

《CAPL脚本实现CANOE工具 Bus-Off自动恢复(含重试机制)》

目录 1.创建CAPL文件 3.编辑CAPL文件 4.CAPL文件功能描述 4.执行CAPL文件结果 1.创建CAPL文件 选择"Insert Network Node" 点击编辑按钮 ->输入CAPL文件的名称->点击打开 ->自动生成一个空的CAPL文件 3.编辑CAPL文件 这边的CANOE软件版本为16 /*!En…

OP-TEE HelloWorld 文件保护实战:把一份 `helloworld.txt` 交给 Secure World 保管(EKB → PTA → CA)

📺 B站视频讲解(Bilibili):https://www.bilibili.com/video/BV1k1C9BYEAB/ 📘 《Yocto项目实战教程》京东购买链接:Yocto项目实战教程 OP-TEE HelloWorld 文件保护实战:把一份 helloworld.txt …

web3作业

【Web第三周】『12.9-12.14』 初步了解数据库(MySQL)初步了解sql注入漏洞练习sql语句搭建sql靶场 初步了解数据库(MySQL) 一、MySQL 基础认知 1. 什么是 MySQL? 一款开源的关系型数据库管理系统(RDBMS&…

基于MATLAB的SIFT特征汽车车标识别系统

摘要:随着智能交通与视频监控技术的快速发展,汽车品牌识别在车辆管理、智能安防和交通监控等领域具有重要的应用价值。然而在实际场景中,车标目标常受到复杂背景、尺度变化、姿态旋转以及光照条件变化等因素的影响,给车标的准确识…

Windows系统文件wdi.dll缺失或损坏问题 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

智能弹性伸缩算法在测试环境中的实践与验证

1 测试环境资源管理的现状与挑战 1.1 传统资源分配模式的瓶颈 软件测试环境长期以来面临资源分配两难困境:固定资源配置导致非测试时段资源闲置率高达60%-75%,而并发测试高峰时又因资源不足引发阻塞。根据Gartner调研数据,企业为保障测试稳…

掌握 Open Graph 协议:让你的网页在社交媒体上大放异彩

🌟 什么是 Open Graph 协议? Open Graph 协议(简称 OG 协议)是由 Facebook 在 2010 年推出的一套技术规范。它的核心目标是允许任何网页成为一个“富对象”(rich object),使其在社交网络&#…

微信小程序_WXML

图片&#xff1a;等比例填充&#xff08;头像&#xff09;&#xff1a;mode“aspectFill”<image src"{{userInfo ? userInfo.avatarUrl :/images/1.png}}" mode"aspectFill"></image>

Flink学习笔记:如何做容错

现在我们已经了解了 Flink 的状态如何定义和使用,那 Flink 是如何做容错的呢?今天我们一起来了解一下。现在我们已经了解了 Flink 的状态如何定义和使用,那 Flink 是如何做容错的呢?今天我们一起来了解一下。 先来…

​三天搞定企业招聘系统----|---附完整源码

一、开发背景随着经济的快速发展和市场竞争的日益激烈&#xff0c;企业对于人才的需求愈发迫切。然而&#xff0c;招聘渠道的分散、简历筛选的繁琐以及招聘周期的漫长&#xff0c;给企业招聘带来了诸多困扰。同时&#xff0c;求职者在寻找合适工作时&#xff0c;也面临着岗位信…

Windows11系统文件wer.dll丢失或损坏问题 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

多云测试的智能调度方案

1 方案概述 1.1 背景与挑战 随着企业数字化转型加速&#xff0c;多云架构已成为现代软件开发的标配环境。测试团队面临异构资源管理复杂、环境部署效率低下、成本控制精度不足三大核心挑战。传统单云测试模式在跨云兼容性验证、突发流量承载等方面显现出明显局限性。 1.2 智…

光伏发电+boost+储能+双向dcdc+并网逆变器控制参考资料 光伏发电+boost+储能+...

光伏发电&#xff0b;boost&#xff0b;储能&#xff0b;双向dcdc&#xff0b;并网逆变器控制参考资料 光伏发电&#xff0b;boost&#xff0b;储能&#xff0b;双向dcdc&#xff0b;并网逆变器控制(低压用户型电能路由器仿真模型)【含笔记&#xff0b;建模参考】 包含Boost、B…

基于风险演进的智能测试策略设计

风险演进背景下的测试新挑战 随着数字化转型加速&#xff0c;软件系统从单体架构向微服务、云原生演进&#xff0c;测试风险不再局限于代码缺陷&#xff0c;而是扩展到安全漏洞、性能瓶颈、兼容性问题及业务连续性等多维度。风险演进的本质在于其动态性&#xff1a;在开发周期…

OOP题目集 4~5 及 课堂测验总结性 Blog

一、前言 本阶段的两次题目集(题目集 4、题目集 5)围绕 “数字电路模拟程序” 展开,是一次循序渐进、逐步深入的编程实践。两次题目集均聚焦于数字电路中逻辑门的模拟实现,核心知识点涵盖面向对象编程(OOP)的核心…

Windows系统文件werui.dll缺少或损坏 下载修复

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

评价页岩油是否值得开采的指标有哪些

评价页岩油是否值得开采&#xff0c;通常需要从地质资源、工程技术、经济效益和生态环境等多个维度进行综合考量。以下为业内通用且权威的评价指标体系&#xff0c;结合了国内外行业标准、经济评价规范及学术研究成果&#xff1a; 一、地质与资源潜力指标 这些指标反映页岩油“…

周日随笔 第一弹

哪来的什么感想,只是疯了之前的胡言乱语罢了。 就这样吧,没关系的,无所谓了。就是记录一下最近的感受吧。 这一周下来好像没有什么特别大的观感,只是觉得想要成为TS的感觉小了很多,也许是因为我自己在心里面安慰我…

能耗黑洞无处遁形!能源管理系统核心功能剖析【带源码】

温馨提示&#xff1a;文末有资源获取方式~能源系统|能源系统源码|企业能源系统|企业能源系统源码|能源监测系统一、Java 与能源管理系统的邂逅​能源管理系统的核心使命在于实现能源的精细化管控。它通过实时收集各类能源数据&#xff0c;如电力、燃气、水、热能等的消耗情况&a…