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

AngularJS SQL

AngularJS + SQL 学习笔记

⚠️核心概念澄清
AngularJS (前端框架) 不能直接连接或操作 SQL 数据库。

  • AngularJS运行在浏览器中,负责 UI 展示和用户交互。
  • SQL运行在后端服务器数据库中(如 MySQL, PostgreSQL, SQL Server)。
  • 中间层:必须通过后端 API(Node.js/Express, Java/Spring, Python/Django, PHP/Laravel等)作为桥梁。

📌学习路径AngularJS (前端)HTTP请求 ($http/$resource)后端API (RESTful)后端逻辑SQL数据库


🏗️ 一、整体架构流程

1. HTTP GET/POST

2. 执行 SQL

3. 返回数据

4. JSON响应

用户界面
AngularJS

后端 API
Node/Java/Python

SQL Database
MySQL/PostgreSQL


📡 二、AngularJS 如何与后端通信

1. 使用$http服务(基础方式)

angular.module('app').controller('UserCtrl',function($http){varvm=this;vm.users=[];// ✅ 获取数据 (SELECT)vm.loadUsers=function(){$http.get('/api/users').then(function(response){vm.users=response.data;// 假设后端返回 JSON 数组}).catch(function(error){console.error('加载失败:',error);});};// ✅ 创建数据 (INSERT)vm.createUser=function(newUser){$http.post('/api/users',newUser).then(function(response){alert('创建成功!ID: '+response.data.id);vm.loadUsers();// 刷新列表});};// ✅ 更新数据 (UPDATE)vm.updateUser=function(user){$http.put('/api/users/'+user.id,user).then(function(){alert('更新成功');});};// ✅ 删除数据 (DELETE)vm.deleteUser=function(id){if(confirm('确定删除?')){$http.delete('/api/users/'+id).then(function(){vm.loadUsers();});}};// 初始化加载vm.loadUsers();});

2. 使用$resource服务(RESTful 风格,更简洁)

需引入ngResource模块。

// 定义资源工厂angular.module('app').factory('UserService',function($resource){return$resource('/api/users/:id',{id:'@id'},{update:{method:'PUT'}// 默认没有 PUT,需自定义});});// Controller 中使用angular.module('app').controller('UserCtrl',function(UserService){varvm=this;// 查询所有 (GET /api/users)vm.users=UserService.query();// 保存新用户 (POST /api/users)vm.save=function(user){UserService.save(user,function(response){vm.users.push(response);// 添加到本地列表});};// 删除 (DELETE /api/users/123)vm.remove=function(user){UserService.delete({id:user.id},function(){varindex=vm.users.indexOf(user);if(index>-1)vm.users.splice(index,1);});};});

优势$resource自动处理 URL 拼接和 CRUD 方法,代码更语义化。


🔌 三、后端 API 示例(以 Node.js + Express + MySQL 为例)

这是 AngularJS 调用的“另一端”。你需要编写后端代码来接收请求并执行 SQL。

1. 安装依赖

npminstallexpress mysql2 cors body-parser

2. 后端代码 (server.js)

constexpress=require('express');constmysql=require('mysql2/promise');// 支持 Promiseconstcors=require('cors');constapp=express();app.use(cors());// 允许跨域(开发环境必需)app.use(express.json());// 数据库连接池constpool=mysql.createPool({host:'localhost',user:'root',password:'password',database:'my_app_db'});// ✅ GET /api/users -> SELECT * FROM usersapp.get('/api/users',async(req,res)=>{try{const[rows]=awaitpool.execute('SELECT * FROM users ORDER BY id DESC');res.json(rows);}catch(err){res.status(500).json({error:err.message});}});// ✅ POST /api/users -> INSERT INTO usersapp.post('/api/users',async(req,res)=>{const{name,email}=req.body;try{const[result]=awaitpool.execute('INSERT INTO users (name, email) VALUES (?, ?)',[name,email]);res.json({id:result.insertId,name,email});}catch(err){res.status(500).json({error:err.message});}});// ✅ PUT /api/users/:id -> UPDATE users SET ...app.put('/api/users/:id',async(req,res)=>{const{id}=req.params;const{name,email}=req.body;try{awaitpool.execute('UPDATE users SET name=?, email=? WHERE id=?',[name,email,id]);res.json({success:true});}catch(err){res.status(500).json({error:err.message});}});// ✅ DELETE /api/users/:id -> DELETE FROM usersapp.delete('/api/users/:id',async(req,res)=>{const{id}=req.params;try{awaitpool.execute('DELETE FROM users WHERE id=?',[id]);res.json({success:true});}catch(err){res.status(500).json({error:err.message});}});app.listen(3000,()=>console.log('Server running on port 3000'));

🔒安全提示

  • 永远不要在前端拼接 SQL 字符串!
  • 后端必须使用参数化查询(Prepared Statements),如上例中的?占位符,防止SQL 注入

🛡️ 四、常见安全问题与最佳实践

1. SQL 注入防护

危险做法(后端):

// 绝对禁止!用户输入直接拼接到 SQL 中pool.execute(`SELECT * FROM users WHERE name = '${userName}'`);

正确做法

// 使用参数化查询pool.execute('SELECT * FROM users WHERE name = ?',[userName]);

2. CORS 跨域问题

  • 如果 AngularJS 运行在http://localhost:8080,后端在http://localhost:3000,浏览器会阻止请求。
  • 解决:后端添加 CORS 头(如上例使用cors中间件),或配置 Nginx 反向代理。

3. 错误处理

  • 前端:始终捕获$http.catch().error(),给用户友好提示。
  • 后端:统一错误响应格式,如{ "success": false, "message": "用户名已存在" }

4. 数据验证

  • 前端验证:使用ng-required,ng-pattern提升用户体验。
  • 后端验证必须再次验证!前端验证可被绕过,后端是最后一道防线。

🧪 五、完整 CRUD 示例结构

project/ ├── frontend/ # AngularJS 前端 │ ├── index.html │ ├── app.js # 模块定义 │ ├── controllers/ │ │ └── UserCtrl.js # 控制器:调用 $http/$resource │ ├── services/ │ │ └── UserService.js # 服务:封装 API 调用(推荐) │ └── views/ │ └── user-list.html # 模板:ng-repeat 展示表格 ├── backend/ # 后端 API │ ├── server.js # Express 服务器 │ ├── routes/ │ │ └── users.js # 路由:处理 /api/users │ └── db/ │ └── connection.js # 数据库连接配置 └── database/ └── schema.sql # SQL 建表语句

schema.sql示例

CREATEDATABASEmy_app_db;USEmy_app_db;CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(100)NOTNULL,emailVARCHAR(150)UNIQUENOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);

📚 六、学习建议

  1. 先掌握 SQL 基础SELECT,INSERT,UPDATE,DELETE,JOIN,WHERE
  2. 再学后端 API 开发:选择一门后端语言(Node.js 最容易上手,因为也是 JavaScript)。
  3. 最后整合 AngularJS:重点学习$http$resource如何与 API 交互。
  4. 调试技巧
    • 浏览器 DevTools → Network 标签页:查看请求是否发出、状态码、响应内容。
    • 后端日志:打印 SQL 语句和执行结果。

❓ 常见问题

Q: AngularJS 能直接连 MySQL 吗?
A:不能。浏览器出于安全考虑,不允许前端代码直接访问数据库。必须通过后端 API。

Q: 为什么我的$http.get返回空数组?
A: 检查:

  1. 后端 API 是否正常返回 JSON?
  2. 是否有 CORS 错误?(Console 中看红色报错)
  3. 数据库中是否有数据?
  4. 后端 SQL 查询是否正确?

Q: 如何处理分页?
A:

  • 前端:传递pagepageSize参数给后端。
  • 后端:SQL 使用LIMIT offset, count(MySQL)或OFFSET/FETCH(SQL Server)。
  • 前端收到数据后,用ng-repeat渲染当前页。

http://www.jsqmd.com/news/683332/

相关文章:

  • 用STM32F1的定时器玩点花的:PWM呼吸灯、编码器测速、输入捕获测频一站式搞定
  • 告别PyInstaller打包DLL缺失:从ImportError到一键部署的实战指南
  • 2026年生物技术论文降AI工具推荐:基因研究和生物工程部分降AI攻略 - 还在做实验的师兄
  • d2s-editor:5分钟学会暗黑破坏神2存档修改,轻松打造完美角色
  • 移动网络下,为何你的公网IP成了‘隐形地址’?
  • 【仅限首批200家认证企业开放】:2026规范合规自检工具链V1.0正式解禁——含静态分析规则包、运行时防护桩、以及NASA/JPL验证过的37个边界用例
  • 从PCIe 2.0到5.0:时钟电平HCSL与LP-HCSL的演进史,以及如何为你的新设计选型
  • 从暗电流到信噪比:手把手教你用Python+Arduino搭建PD(光电二极管)性能测试平台
  • 在Windows上用Anaconda配置BiSeNet V2训练环境,避开Linux依赖的坑
  • 【VASP】QVASP 实战:从安装到 ELF 电荷局域函数计算
  • ORAN前传延迟实战:手把手教你配置O-DU与O-RU的时间窗(含eCPRI测量避坑)
  • 3步解决方案:使用s7netplus实现西门子PLC数据采集与自动化控制
  • Project Eye护眼工具:拯救数字工作者视力的智能守护者
  • 从GitHub Issues到个人学习计划:Mermaid甘特图的5个意想不到的实用场景
  • Semi Design v2.95.0 发布:Input 等组件功能更新,多组件问题修复
  • 2026年电子商务论文降AI工具推荐:平台运营和用户行为研究降AI方案 - 还在做实验的师兄
  • 别再只用递归了!C语言实现斐波那契数列的三种高效算法对比(附性能测试)
  • 损失函数‘混搭’指南:我是如何用MS-SSIM+L1组合,在Kaggle图像比赛中提升排名的
  • 保姆级教程:用MQTTX和EMQX从零搭建一个物联网消息收发Demo(含WebSocket监控)
  • 明日方舟素材库:创作者与开发者的专业资源宝典
  • 2026 年国内做私有化即时通讯的厂家哪家比较靠谱?信创场景标杆厂商盘点
  • 移动端手势识别与处理
  • 纤维转盘/叠螺机/板框压滤机/斜板沉淀设备/气浮机技术实力对比:国产vs进口、模块化vs传统结构 - 品牌推荐大师1
  • Visual Studio:用调试的方式查看C语言字符串保存的内容
  • 2026年研究生论文修改阶段降AI攻略:收到返修意见后的处理完整方案 - 还在做实验的师兄
  • 从RetinaNet到S2A-Net:我是如何将航拍目标检测mAP提升10个点的
  • 保姆级教程:用Ollama部署translategemma-12b-it,翻译图片文字就这么简单
  • 终极指南:如何用Tesseract轻松实现免费OCR文字识别
  • 企业云盘权限体系实战:从粗放授权到最小权限的踩坑与重构
  • 3分钟快速上手:免费Android音频转发工具sndcpy终极指南