[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"article-express":22,"comments-express":43,"footer-socials":44},{"site_title":4,"site_subtitle":5,"home_intro":6,"avatar":7,"seo_keywords":8,"seo_description":9,"site_subtitle_highlight":10,"home_description":11,"about_name":12,"about_intro":13,"code_comment_2":14,"code_log":15,"code_skills":16,"code_goal":17,"code_comment_1":18,"meteor_density":19,"meteor_max_count":19,"meteor_enabled":20,"meteor_speed":21},"ShineGoldYao","架构代码，","全栈开发者 \u002F 开源爱好者 \u002F 技术探索者","https:\u002F\u002Fforuda.gitee.com\u002Favatar\u002F1762402862010015318\u002F16382196_yaoxingjin_1762402861.png!avatar200","ShiGoldYao,技术博客,全栈开发","专注于前沿技术分享与开源项目展示的个人技术博客","书写未来。","大家好，我是 ShiGoldYao。一名全栈学习与技术爱好者。在这里，我分享关于现代 Web 开发、技术框架学习记录以及极客生活的深度思考。","ShiGoldYao","我是一名全栈技术学习者，对构建高性能、可扩展的现代 Web 应用充满热情。过去一年里，我从初识互联网前后端开发，到逐步沉淀技术体系，始终保持着对前端、后端与工程化的持续探索。\n\n我坚信 “代码如诗”。除了日常学习与项目实践，我也会花大量时间关注开源社区，尝试摸索 WebAssembly、Rust 等前沿技术在浏览器端的更多可能，不断挑战性能与体验的边界。\n\n生活里的我并不只有代码：闲暇时会打打永劫无间，享受博弈与操作的快感；也喜欢打乒乓球，在运动中放松自己；当然，最幸福的时光，还是和女朋友一起慢慢生活、认真恋爱。","\u002F\u002F 🚀 开启学习之旅","","Vue , TypeScript , Nest , Mysql","成为优秀的前端全栈工程师","\u002F\u002F 欢迎来到我的技术世界","3","true","5",{"id":23,"title":24,"slug":25,"coverUrl":15,"summary":15,"content":26,"htmlContent":27,"categoryId":28,"viewCount":29,"likeCount":30,"isTop":30,"isPublish":31,"seoKeywords":15,"seoDescription":15,"publishTime":32,"createTime":33,"updateTime":34,"deleteTime":35,"category":36,"tags":42},"9","00 - 项目流程","express","# 00 - 项目流程\n\n- 初始化 npm init -y\n- 下载express框架 npm i express@4.17.1\n- 热加载 npm i -g nodemon   启动 nodemon .\u002F文件名\n- 服务器文件indexRouter.js\n- 请求处理文件UserRouter.js\n- 两个文件建立联系\n- 数据库连接 ，下载npm i mysql2\n- 创建文件夹db，写连接文件 index.js\n- 让index.js和UserRouter.js连接\n- ww解决跨域问题 npm i cors@2.8.5\n- 在服务器文件中引入\n- 解决发送请求的问题，引入axios.js文件\n- 新建js文件夹，导入axios.js文件\n\n# 01 - Express简介\n\n## 1.1 简介\n\n​\t是基于Node.js平台，快速，开放，极简的Web开发框架[第三方提供的]，服务构建的优化\n\n## 1.2 作用\n\n​\t可以快速搭建Web网站的服务器或者API接口的服务器\n\n## 1.3 使用\n\n 1. 项目初始化  **npm init -y**\n\n 2. 安装Express:  **npm i express@4.17.1 [需要管理员的doc运行]**\n\n 3. 创建基本Web服务器\n\n    ```javascript\n    \u002F\u002F 1.导入express模块\n    const express = require('express')\n    \u002F\u002F 2.创建服务器\n    const server = express()\n    \u002F\u002F 3.启动服务器\n    server.listen(8888,(reg,res) =>{\n        console.log('服务器启动成功')\n    })\n    ```\n\n   \n\n​\t4.请求的处理  ('请求地址','处理函数')\n\n```javascript\n\u002F\u002F get请求\nserver.get('\u002Fuser\u002Flogin',(req,res) =>{\n     console.log('我处理的是get请求的登录');\n)};\n    \n\u002F\u002F post请求    \nserver.post('\u002Fuser\u002Flo',(reg,res) =>{ \n    console.log('我处理的是POST请求的注册');\n    })\n```\n\n  5.处理函数\n\n```javascript\n\u002F\u002F 3.请求书写\nserver.get('\u002Fuser\u002Flogin',(req,res) =>{\n    \n    \u002F\u002F 响应对象 .send(内容) 给服务器响应的内容[可以是字符串，JSON，且不需要处理中文乱码问题]\n    res.send({\n        code:200,\n        mgs:'登录陈功',\n        data:'yyds'\n    })\n})\n\nserver.post('\u002Fuser\u002Flo',(req,res) =>{\n    \u002F\u002F 响应对象 .send(内容) 给服务器响应的内容[可以是字符串，JSON，且不需要处理中文乱码问题]\n    res.send({\n        code:200,\n        msg:'登录成功666',\n        data:'post登录方式'\n    })\n})\n\n```\n\n6.请求参数获取\n\n- get方式获取url中的参数对象 **req.query**\n\n  ```javascript\n      \u002F\u002F 第一种方式 query 这种方式查询字符串为 \u002F?username=zhangsan&password=123456\n      const userMsg = req.query\n       console.log(userMsg);\n       console.log(userMsg.username);\n       console.log(userMsg.password);\n  \n  ```\n\n  \n\n- get方式获取url动态参数 **req.params**\n\n  ```javascript\n   \u002F\u002F 第二种方式 params\n  \u002F\u002F  这种方式查询字符串为 \u002Flogin\u002Fzhangsan\u002F123456\n  server.get('\u002Fuser\u002Flogin1\u002F:username\u002F:password',(req,res) =>{\n      const userMsg1 = req.params\n      console.log(userMsg1);\n      console.log(userMsg1.username);\n      console.log(userMsg1.password);\n      \n  ```\n\n  \n\n- post方式获取传递数据\n\n  ```javascript\n  \u002F\u002F 请求参数识别\n  JSON格式的转化\n  server.use(express.json())\n  url编码格式的转化\n  \u002F\u002Furl 编码格式  password=122&name=zhangsna\n  server.use(express.urlencoded())\n  \n  router.post('\u002Fuser\u002Flo', (req, res) => {\n      \u002F\u002F 请求\n      const userMsg = req.body\n      console.log(userMsg)\n      \n      res.send({\n          code: 200,\n          msg: '登陆成功666',\n          data: 'post方式'\n      })\n  ```\n\n 7.服务器热加载  全局安装nodemon       **npm i -g nodemon**      服务启动[管理员身份启动]  **nodemon 文件名.js**\n\n 8.测试\n\n![image-20251230174941434](images\u002Fimage-20251230174941434.png)\n\n# 02 - 路由\n\n## 2.1 - 路由的定义\n\n​\t映射关系。在Express中，路由值得是客户端的请求与服务器处理函数之间的映射关系。\n\n分3部分组成，分别是请求的类型，请求的url网址，处理函数\n\n## 2.2 - 优化\n\n​\t实际的项目开发前端所发送的请求会很多，而所有的路由都绑定写到一个js文件会显得很臃肿，不利于后期的维护。我们需要把操作同一个表的请求拿出来单独放到一个js文件中，后期只要想办法把单独摘出来的js文件与最开始的文件建立起关联\n\n**注意：node自带的模块直接 require('名字')     自己书写的 require('路径')**\n\n**1.创建针对于表的路由请求**\n\n\t\t* 导入express模块\n\t\t* 创建路由模块\n\t\t* 前端请求处理模块\n\t\t* 向外导出路由对象\n\n```javascript\n\u002F\u002F 1.导入express模块\nconst express = require('express')\n\u002F\u002F 2.创建路由对象\nconst router = express.Router()\n\u002F\u002F 3.请求书写\nrouter.get('\u002Fuser\u002Flogin',(req,res) =>{\n    \u002F\u002F const userMsg = req.query\n    \u002F\u002F console.log(userMsg);\n    \u002F\u002F console.log(userMsg.username);\n    \u002F\u002F console.log(userMsg.password)    \n    \u002F\u002F 响应\n    res.send({\n        code:200,\n        mgs:'登录陈功',\n        data:'yyds'\n    })\n})\n\nrouter.get('\u002Fuser\u002Flogin1\u002F:username\u002F:password',(req,res) =>{\n    \u002F\u002F 请求\n    const userMsg1 = req.params\n    console.log(userMsg1);\n    \n     \u002F\u002F 响应\n    res.send({\n        code:200,\n        mgs:'登录陈功',\n        data:'yyds'\n    })\n})\n\nrouter.post('\u002Fuser\u002Flo',(req,res) =>{\n    \u002F\u002F请求\n    const userMsg2 = req.body\n    console.log(userMsg2);\n    \n    res.send({\n        code:200,\n        msg:'登录成功666',\n        data:'post登录方式'\n    })\n})\nrouter.get('\u002Fuser\u002Fdept',(req,res) =>{\n    \n})\n\u002F\u002F 导出router对象\nmodule.exports = router\n\n```\n\n2.**服务器文件书写**\n\n\t* 导入express模块\n\t* 导入user路由模块\n\t* 创建服务器对象\n\t* 服务器绑定路由\n\t* 服务器启动\n\n```javascript\n\u002F\u002F 1.导入express模块\nconst express = require('express')\n\u002F\u002F 导入文件 .\u002F同级  ..\u002F上一级\nconst user = require('.\u002Frouter\u002FuserRouter')\n\u002F\u002F 2.创建服务器\nconst server = express()\n\u002F\u002F 请求参数识别\nserver.use(express.json())\nserver.use(express.urlencoded())\n\u002F\u002F 两个文件产生联系\nserver.use(user)\n\u002F\u002F 3.启动服务器\nserver.listen(8888,(reg,res) =>{\n    console.log('服务器启动');\n})\n```\n\n\n\n# 03 - 数据库的连接\n\n## 3.1 数据库模块安装\n\n​\t**npm i mysql@2.18.1**\n\n​\t**npm i mysql@2**\n\n## 3.2 连接对象创建\n\n​\t1.项目根目录下新建\u002Fdb\u002Findex.js文件\n\n```javascript\n\u002F\u002F 1.连接数据库\nvar mysql = require('mysql2')\n\u002F\u002F 2.创建连接对象\nvar db = mysql.createPool({\n    host:'127.0.0.1',\n    user:'root',\n    password:'123456',\n    database:'01My-sql'   \u002F\u002F 数据库下新建的数据库\n})\n\u002F\u002F 3.导出连接对象\nmodule.exports = db\n```\n\n​\t2.处理前端请求映射的模块操作数据库\n\n```javascript\n\u002F\u002F 1.导入模块\nconst express = require('express')\n\u002F\u002F 导入数据库连接对象\nconst db = require('..\u002Fdb\u002Findex')\n\u002F\u002F 2.创建路由对象\nvar router = express.Router()\n\n\u002F\u002F 3.请求的处理\nrouter.get('\u002Fuser\u002FfindAll', (req, res) => {\n    \u002F\u002F 获取请求的参数\n    \u002F\u002F 自定义sql语句\n    const findAll = 'select * from dept'\n    \u002F\u002F 让数据库查询\n    db.query(findAll, (err, resu) => {\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙，查询失败，请稍后重试',\n                data: null\n            })\n        }\n        else {\n            return res.send({\n                code: 200,\n                msg: '查询成功',\n                data: resu\n            })\n        }\n    })\n\n})\nrouter.get('\u002Fuser\u002FfindByName', (req, res) => {\n    \u002F\u002F 获取请求的参数\n    var msg = req.query\n    \u002F\u002F 写sql语句\n    const findByName = 'select * from dept where dname = ? '\n    \u002F\u002F 让数据库查询\n    db.query(findByName, msg.name, (err, resu) => {\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        else if (resu.length === 0) {\n            return res.send({\n                code: 200,\n                msg: '查无此人',\n                data: ''\n            })\n        }\n        else {\n            return res.send({\n                code: 200,\n                msg: '查询成功',\n                data: resu\n            })\n        }\n    })\n})\n\u002F\u002F 新增 post\nrouter.post('\u002Fuser\u002FaddUser', (req, res) => {\n    \u002F\u002F 1.获取参数 包含username password des\n    var msg = req.body\n    console.log(msg)\n    \n    \u002F\u002F 2.sql语句\n    const addUser = 'insert into user set ?'\n    \u002F\u002F 3.执行语句\n    db.query(addUser, {\n        username: msg.username,\n        password: msg.password,\n        des: msg.des\n    }, (err, resu) => {\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        \u002F\u002F affectedRows 数据库影响行数\n        else if (resu.affectedRows === 0) {\n            return res.send({\n                code: 500,\n                msg: '添加失败',\n                data:''\n            })\n        }\n        else{\n            return res.send({\n                code:200,\n                msg:'新增成功',\n                data:resu\n            })\n        }\n    })\n})\n\u002F\u002F 修改 put\nrouter.put('\u002Fuser\u002FmodUser',(req,res)=>{\n    \u002F\u002F 1.获取参数\n    const user = req.body\n    \u002F\u002F 2.写sql语句\n    const modUser = 'update user set ? where id=?'\n    \u002F\u002F 3.执行sql语句以及错误和结果的处理\n    db.query(modUser,[user,user.id],(err,resu)=>{\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        else if(resu.affectedRows === 0){\n            return res.send({\n                code:200,\n                msg:'网络问题',\n                data:''\n            })\n        }\n        else{\n            return res.send({\n                code:200,\n                msg:'修改成功',\n                data:resu\n            })\n        }\n    })\n})\n\n\u002F\u002F 删除 delete\nrouter.delete('\u002Fuser\u002FdeleteById',(req,res)=>{\n    \u002F\u002F 获取参数\n    const msg = req.query\n    \u002F\u002F sql语句\n    const detsql = 'delete from user where id = ?'\n    \u002F\u002F 执行sql语句\n    db.query(detsql,msg.id,(err,resu)=>{\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        else if(resu.affectedRows === 0){\n            return res.send({\n                code:200,\n                msg:'没有此用户',\n                data:''\n            })\n        }\n        else{\n            return res.send({\n                code:200,\n                msg:'删除成功',\n                data:resu\n            })\n        }\n    })\n})\n\n\u002F\u002F 4.导出文件\nmodule.exports = router\n```\n\n\n\n# 04 - Express增删改查\n\n​\t获取参数，写sql语句，执行语句，导出文件\n\n## 4.1 增加 post\n\n```javascript\n\u002F\u002F 1.导入模块\nconst express = require('express')\n\u002F\u002F 导入数据库连接对象\nconst db = require('..\u002Fdb\u002Findex')\n\u002F\u002F 2.创建路由对象\nvar router = express.Router()\n\u002F\u002F 3.请求的处理\n\n\u002F\u002F 新增 post\nrouter.post('\u002Fuser\u002FaddUser', (req, res) => {\n    \u002F\u002F 1.获取参数 包含username password des\n    var msg = req.body\n    console.log(msg)\n    \n    \u002F\u002F 2.sql语句\n    const addUser = 'insert into user set ?'\n    \u002F\u002F 3.执行语句\n    db.query(addUser, {\n        username: msg.username,\n        password: msg.password,\n        des: msg.des\n    }, (err, resu) => {\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        \u002F\u002F affectedRows 数据库影响行数\n        else if (resu.affectedRows === 0) {\n            return res.send({\n                code: 500,\n                msg: '添加失败',\n                data:''\n            })\n        }\n        else{\n            return res.send({\n                code:200,\n                msg:'新增成功',\n                data:resu\n            })\n        }\n    })\n})\n\u002F\u002F 4.导出文件\nmodule.exports = router\n```\n\n\n\n## 4.2 删除 delete\n\n```javascript\n\u002F\u002F 1.导入模块\nconst express = require('express')\n\u002F\u002F 导入数据库连接对象\nconst db = require('..\u002Fdb\u002Findex')\n\u002F\u002F 2.创建路由对象\nvar router = express.Router()\n\u002F\u002F 3.请求的处理\n\n\u002F\u002F 删除 delete\nrouter.delete('\u002Fuser\u002FdeleteById',(req,res)=>{\n    \u002F\u002F 获取参数\n    const msg = req.query\n    \u002F\u002F sql语句\n    const detsql = 'delete from user where id = ?'\n    \u002F\u002F 执行sql语句\n    db.query(detsql,msg.id,(err,resu)=>{\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        else if(resu.affectedRows === 0){\n            return res.send({\n                code:200,\n                msg:'没有此用户',\n                data:''\n            })\n        }\n        else{\n            return res.send({\n                code:200,\n                msg:'删除成功',\n                data:resu\n            })\n        }\n    })\n})\n\u002F\u002F 4.导出文件\nmodule.exports = router\n```\n\n\n\n## 4.3 修改\n\n```javascript\n\u002F\u002F 1.导入模块\nconst express = require('express')\n\u002F\u002F 导入数据库连接对象\nconst db = require('..\u002Fdb\u002Findex')\n\u002F\u002F 2.创建路由对象\nvar router = express.Router()\n\u002F\u002F 3.请求的处理\n\n\u002F\u002F 修改 put\nrouter.put('\u002Fuser\u002FmodUser',(req,res)=>{\n    \u002F\u002F 1.获取参数\n    const user = req.body\n    \u002F\u002F 2.写sql语句\n    const modUser = 'update user set ? where id=?'\n    \u002F\u002F 3.执行sql语句以及错误和结果的处理\n    db.query(modUser,[user,user.id],(err,resu)=>{\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        else if(resu.affectedRows === 0){\n            return res.send({\n                code:200,\n                msg:'网络问题',\n                data:''\n            })\n        }\n        else{\n            return res.send({\n                code:200,\n                msg:'修改成功',\n                data:resu\n            })\n        }\n    })\n})\n\u002F\u002F 4.导出文件\nmodule.exports = router\n```\n\n\n\n## 4.4 查询\n\n```javascript\n\u002F\u002F 1.导入模块\nconst express = require('express')\n\u002F\u002F 导入数据库连接对象\nconst db = require('..\u002Fdb\u002Findex')\n\u002F\u002F 2.创建路由对象\nvar router = express.Router()\n\u002F\u002F 3.请求的处理\n\n\u002F\u002F 查询全部\nrouter.get('\u002Fuser\u002FfindAll', (req, res) => {\n    \u002F\u002F 获取请求的参数\n    \u002F\u002F 自定义sql语句\n    const findAll = 'select * from dept'\n    \u002F\u002F 让数据库查询\n    db.query(findAll, (err, resu) => {\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙，查询失败，请稍后重试',\n                data: null\n            })\n        }\n        else {\n            return res.send({\n                code: 200,\n                msg: '查询成功',\n                data: resu\n            })\n        }\n    })\n})\n\u002F\u002F 4.导出文件\nmodule.exports = router\n\n\n\u002F\u002F 条件查询\nrouter.get('\u002Fuser\u002FfindByName', (req, res) => {\n    \u002F\u002F 获取请求的参数\n    var msg = req.query\n    \u002F\u002F 写sql语句\n    const findByName = 'select * from dept where dname = ? '\n    \u002F\u002F 让数据库查询\n    db.query(findByName, msg.name, (err, resu) => {\n        if (err) {\n            return res.send({\n                code: 500,\n                msg: '服务器繁忙',\n                data: null\n            })\n        }\n        else if (resu.length === 0) {\n            return res.send({\n                code: 200,\n                msg: '查无此人',\n                data: ''\n            })\n        }\n        else {\n            return res.send({\n                code: 200,\n                msg: '查询成功',\n                data: resu\n            })\n        }\n    })\n})\n\u002F\u002F 4.导出文件\nmodule.exports = router\n```\n\n\n\n# 05 - 跨域问题解决\n\n## 5.1 跨域定义\n\n​\t当一个请求url的协议，域名，端口，三者之间的任意一个与当前页面url不同\n\n## 5.2 原因\n\n​\t浏览器的同源策略问题\n\n## 5.3 解决\n\n​\t1.安装 **cors npm i cors@2.85**\n\n​\t2.在主服务创建的js文件中导入 cors 并在服务器中使用(要在路由之间导入跨域)\n\n```javascript\nconst cors = require('cors')\nserver.use(cors())\n```\n\n\n\n\n\n\n\n​\t\n\n\n\n​\t\n\n  ",null,"2",17,0,1,"2026-04-07T16:14:52.460Z","2026-04-07T16:14:52.462Z","2026-06-03T07:20:39.639Z","0",{"id":28,"categoryName":37,"slug":38,"description":39,"sort":30,"isEnable":31,"createTime":40,"updateTime":41,"deleteTime":30},"后端开发","backend-engineering","222","2026-04-03T02:36:33.016Z","2026-04-07T16:38:50.279Z",[],[],[]]