3 连接mysql 数据库 进行数据的存储和读取
1下载node 连接模块npm i mysql -s2 在 src 下创建 conf 文件夹 用于存放配置文件 新建db.js通过环境参数的不同进行线上和线下配置const env process.env.NODE_ENV//环境参数 let MYSQL_CONF if (env dev) { MYSQL_CONF { host: localhost, user: root, password: , port: 3306, database: myblog }; } if (env production) { MYSQL_CONF { host: localhost, user: root, password: , port: 3306, database: myblog }; } module.exports { MYSQL_CONF }3创建 db 文件夹 用于存放数据操作文件 msyql.exe//引入msyql模块 const mysql require(mysql); //引入数据库配置 const { MYSQL_CONF } require(../config/db); //创建数据库连接 const con mysql.createConnection(MYSQL_CONF); //连接数据库 con.connect(); // 执行sql代码 function exec (sql) { const promise new Promise((resolve, reject) { // con.query(sql, (err, result) { if (err) { reject(err); return } resolve(result) }) }); return promise; } module.exports { exec };4创建数据库 文件创建 myblog 数据库 创建 两张表CREATE TABLE blogs ( id int(11) NOT NULL AUTO_INCREMENT, title varchar(50) NOT NULL, content longtext NOT NULL, createtime bigint(20) NOT NULL DEFAULT 0, author varchar(20) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT14 DEFAULT CHARSETutf8;CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(20) NOT NULL, password varchar(20) NOT NULL, realname varchar(10) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT2 DEFAULT CHARSETutf8;修改controller 下的文件blog.jsconst { exec } require(../db/mysql) const getList (author, keyword) { //11 保证语法不报错 let sql select * from blogs where 11 ; if (author) { sql and author${author} } if (keyword) { sql and title like %${keyword}%; } sql order by createtime desc;; return exec(sql) } const getDetail (id) { const sql select * from blogs where id${id}; return exec(sql).then(rows { return rows[0] }) } const newBlog (blogData {}) { const title blogData.title; const content blogData.content; const author blogData.author; const createTime Date.now(); const sql INSERT INTO blogs (title,content,createtime,author) VALUES (${title},${content},${createTime},${author}); ; return exec(sql).then(insertData { console.log(insertData is , insertData); return { id: insertData.insertId } }) } const updateBlog (id, blogData {}) { const title blogData.title; const content blogData.content; const sql UPDATE blogs SET title ${title},content ${content} WHERE id${id};; return exec(sql).then(updateData { console.log(updateData); if (updateData.affectedRows 0) { return true } return false }) } const delBlog (id,author) { const sql DELETE FROM blogs WHERE id${id} AND author${author}; return exec(sql).then(delData { if (delData.affectedRows 0) { return true } return false }) } module.exports { getList, getDetail, newBlog, updateBlog, delBlog }user.jsconst { exec } require(../db/mysql) const loginCheck (username, password) { const sql SELECT username,realname FROM users WHERE username${username} AND password ${password} ; return exec(sql).then(rows { return rows[0] || {} }) } module.exports { loginCheck }修改app.jsconst querystring require(querystring) const handleBlogRouter require(./src/router/blog) const handleUserRouter require(./src/router/user) //用于处理 post data const getPostData (req) { const promise new Promise((resolve, reject) { if (req.method ! POST) { resolve({}) return } if (req.headers[content-type] ! application/json) { resolve({}) return } let postData req.on(data, chunk { postData chunk.toString() }) req.on(end, () { if (!postData) { resolve({}) return } resolve( JSON.parse(postData) ) }) }) return promise } const serverHandle (req, res) { //设置返回格式 res.setHeader(Content-type, application/json) //处理 path const url req.url req.path url.split(?)[0] //解析 query req.query querystring.parse(url.split(?)[1]) //处理 post Data getPostData(req).then(postData { req.body postData console.log(postData); //处理blog路由 const blogResult handleBlogRouter(req, res) if (blogResult) { blogResult.then(blogData { res.end(JSON.stringify(blogData)) }) return } //处理user路由 const userResult handleUserRouter(req, res) if (userResult) { userResult.then(userData { res.end(JSON.stringify(userData)) }) return } // 未命中路由 返回404 res.writeHead(404, { Content-type: text/plain }) res.write(404 Not Found\n) res.end() }) } module.exports serverHandle修改路由const { getList, getDetail, newBlog, updateBlog, delBlog } require(../controller/blog) const { SuccessModel, ErrorModel } require(../model/resModel) const handleBlogRouter (req, res) { const method req.method const id req.query.id //获取博客列表 if (method GET req.path /api/blog/list) { const author req.query.author || const keyword req.query.keyword || const result getList(author, keyword) return result.then(listData { return new SuccessModel(listData) }) } //获取博客详情 if (method GET req.path /api/blog/detail) { const result getDetail(id) return result.then(data { return new SuccessModel(data) }) } //新建一篇博客 if (method POST req.path /api/blog/new) { req.body.author zhangsan const result newBlog(req.body) return result.then(data { return new SuccessModel(data) }) } //更新一篇博客 if (method POST req.path /api/blog/update) { const result updateBlog(id, req.body) return result.then(val { if (val) { return new SuccessModel(更新成功) } else { return new ErrorModel(更新失败) } }) } //删除一篇博客 if (method POST req.path /api/blog/del) { const author zhangsan const result delBlog(id, author); return result.then(val { if (val) { return new SuccessModel(删除成功) } else { return new ErrorModel(删除失败) } }) } } module.exports handleBlogRouterconst { loginCheck } require(../controller/user) const { SuccessModel, ErrorModel } require(../model/resModel) const handleUserRouter (req, res) { const method req.method //登录 if (method POST req.path /api/user/login) { const { username, password } req.body const result loginCheck(username, password) return result.then(data { if (data.username) { return new SuccessModel() } return new ErrorModel(登录失败) }) } } module.exports handleUserRouter

相关新闻

SteamAutoCrack完整教程:3步快速移除游戏DRM保护实现离线游戏

SteamAutoCrack完整教程:3步快速移除游戏DRM保护实现离线游戏

SteamAutoCrack完整教程:3步快速移除游戏DRM保护实现离线游戏 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack SteamAutoCrack是一款专业的Steam游戏自动破解工具&#xff0…

2026/7/28 16:51:53阅读更多 →
【独家】MIT+DeepMind联合泄露报告:2026年前AI将突破因果推理瓶颈——附5个已验证的产业级应用信号

【独家】MIT+DeepMind联合泄露报告:2026年前AI将突破因果推理瓶颈——附5个已验证的产业级应用信号

更多请点击: https://intelliparadigm.com 第一章:AI因果推理突破的范式转移与历史坐标 传统机器学习长期囿于相关性建模,将“统计拟合”误作“机制理解”。而近年来,以Pearl的do-calculus为理论基石、结合结构因果模型&#xff…

2026/7/28 16:51:53阅读更多 →
2012-2018普及组第一题题解

2012-2018普及组第一题题解

noip2018 标题统计 【题目描述】 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。 【输入】 输入文…

2026/7/28 16:51:53阅读更多 →
Human Resource Machine 全成就通关 第38关

Human Resource Machine 全成就通关 第38关

效率 -- HUMAN RESOURCE MACHINE PROGRAM -- COPYFROM 11 ADD 11 ADD 11 COPYTO 8 COPYFROM 10 ADD 10 ADD 10 COPYTO 7 COPYFROM 9 COPYTO 3 BUMPUP 3 BUMPUP 3 BUMPUP 3 ADD 3 …

2026/7/28 18:02:03阅读更多 →
instanceof, isinstance,isAssignableFrom的区别

instanceof, isinstance,isAssignableFrom的区别

总体来说isInstance和instanceOf都是用于判断一个对象是否是一个类或者接口的实现对象,但isInstance 因为.class对象可以动态获取因此泛用性更强,而isAssignableFrom则是用于两个类或者接口之间的比较instanceOfinstanceof运算符 只被用于对象引用变量&a…

2026/7/28 18:02:03阅读更多 →
SpringBoot面试题

SpringBoot面试题

目录1.为什么使用SpringBoot2.SpringBootApplication注解的作用1.为什么使用SpringBoot 可以基于starter构建配置没有繁琐的xml配置嵌入式服务器自动装配技术 2.SpringBootApplication注解的作用 被这个注解标注的类会成为启动类,该类所在的位置

2026/7/28 18:02:03阅读更多 →
【论文阅读+代码复现】GSPN:Generative Shape Proposal Network for 3D Instance Segmentation in Point Cloud

【论文阅读+代码复现】GSPN:Generative Shape Proposal Network for 3D Instance Segmentation in Point Cloud

Brief 这是一篇CVPR18上的文章,虽然表示是说的实例分割;但是听同组的同学的推荐,也可以做定位方面的事情,因此加入到了paperlist。 Abstruct Instead of treating object proposal as a direct bounding box regression problem…

2026/7/28 18:02:03阅读更多 →
Python的标准库,random()

Python的标准库,random()

random()函数产生伪随机数,伪随机数是采用梅森旋转算法生成的(伪)随机序列中的元素,称为随机数基本随机函数:seed()、random()扩展随机函数:ranint()、getrandbits()、uniform()、randrange()、choice()、s…

2026/7/28 18:02:03阅读更多 →
如何用Webcamoid在10分钟内将普通摄像头变成创意工作室?终极指南

如何用Webcamoid在10分钟内将普通摄像头变成创意工作室?终极指南

如何用Webcamoid在10分钟内将普通摄像头变成创意工作室?终极指南 【免费下载链接】webcamoid Webcamoid is a full featured and multiplatform camera suite. 项目地址: https://gitcode.com/gh_mirrors/we/webcamoid 你是否厌倦了单调的视频会议画面&#…

2026/7/28 18:00:03阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:29阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/27 16:57:54阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →