位置: IT常识 - 正文

【Node.js实战】一文带你开发博客项目(API 对接 MySQL)(node.js教程详细)

编辑:rootadmin
【Node.js实战】一文带你开发博客项目(API 对接 MySQL)

推荐整理分享【Node.js实战】一文带你开发博客项目(API 对接 MySQL)(node.js教程详细),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:node.js基础入门,node.js gui,node.js gui,node.js基础入门,node.js入门教程,node-js,node js教程,node js教程,内容如对您有帮助,希望把文章链接给更多的朋友!

个人简介

👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未来打算: 为中国的工业软件事业效力n年 🥇推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2&Vue3项目实战 🥝Node.js 🌕个人推广:每篇文章最下方都有加入方式,旨在交流学习&资源分享,快加入进来吧

Node.js系列文章目录内容参考链接Node.js(一)初识 Node.jsNode.js(二)Node.js——开发博客项目之接口Node.js(三)Node.js——一文带你开发博客项目(使用假数据处理)Node.js(四)Node.js——开发博客项目之MySQL基础文章目录Node.js系列文章目录一、前言二、Node.js 连接 MySQL三、API 对接 MySQL1、文件目录2、控制器_controller3、路由_router四、各个接口的测试四、写在最后(附源码)一、前言

前面我们已经使用了 假数据去处理路由接口,并学习了开发博客路由相关 MySQL的基础知识。

下面我们就可以 整合改进 这两部分,实现 API 和 MySQL 的对接 工作。

二、Node.js 连接 MySQL

安装 MySQL

npm install mysql

在 src 目录下创建 ./conf/db.js 文件,用于连接数据库的配置

db.js 文件

线上环境与开发环境的配置是不一样的这里写的是一样的,因为项目没有上线// 获取环境参数, process 为 node.js 进程的一些信息const env = process.env.NODE_ENV// 配置let MYSQL_CONF// 开发环境下if (env === 'dev') { MYSQL_CONF = { host: 'localhost', user: 'root', password: '1234abcd', port: '3306', database: 'myblog' }}// 线上环境下if (env === 'production') { MYSQL_CONF = { host: 'localhost', user: 'root', password: '1234abcd', port: '3306', database: 'myblog' }}// 导出共享module.exports = { MYSQL_CONF}

在 src 目录下创建 ./db/mysql.js 文件,用于存放一些数据

mysql.js 文件

引入 mysql 和连接数据库封装 sql 函数,用于统一执行// 引入 MySQLconst mysql = require('mysql')// 引入数据库连接配置const { MYSQL_CONF } = require('../conf/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}三、API 对接 MySQL1、文件目录

2、控制器_controller

blog.js 文件

blog 相关 sql 逻辑返回的是 promise 实例// 导入执行 sql 的相关内容const { exec } = require('../db/mysql')// 获取博客列表(通过作者和关键字)const getList = (author, keyword) => { // 1=1 是为了语法的绝对正确,注意以下 sql 拼接时的空格 let sql = `select * from blogs where 1=1 ` if (author) { sql += `and author='${author}' ` } if (keyword) { sql += `and title like '%${keyword}%' ` } // 以时间的倒序 sql += `order by createtime desc;` // 返回 promise return exec(sql)}// 获取博客详情(通过 id)const getDetail = (id) => { const sql = `select * from blogs where id='${id}'` return exec(sql).then(rows => { // 返回数组的对象 return rows[0] })}// 新建博客 newBlog 若没有,就给它一个空对象const newBlog = (blogData = {}) => { // blogData 是一个博客对象,包含 title content author 属性 const title = blogData.title const content = blogData.content const author = blogData.author const createTime = Date.now() // sql 插入语句 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 } })}// 更新博客(通过 id 更新)const updateBlog = (id, blogData = {}) => { // id 就是要更新博客的 id // blogData 是一个博客对象 包含 title content 属性 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 is ', updateData) // 更新的影响行数大于 0,则返回 true if (updateData.affectedRows > 0) { return true } return false })}// 删除博客(通过 id 删除)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.js 文件

登录相关 sql 逻辑返回的是 promise 实例const { 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}3、路由_router

blog.js 文件

博客相关路由调用控制器中的方法// 导入博客和用户控制器相关内容const { getList, getDetail, newBlog, updateBlog, delBlog } = require('../controller/blog') // 导入成功和失败的模型const { SuccessModel, ErrorModel } = require('../model/resModel')// blog 相关路由const handleBlogRouter = (req, res) => { const method = req.method // GET/POST const id = req.query.id // 获取 id // 获取博客列表 GET 请求 if (method === 'GET' && req.path === '/api/blog/list') { // 博客的作者,req.query 用在 GET 请求中 const author = req.query.author || '' // 博客的关键字 const keyword = req.query.keyword || '' // 查询的结果 const result = getList(author, keyword) return result.then(listData => { return new SuccessModel(listData) }) } // 获取博客详情 GET 请求 if (method === 'GET' && req.path === '/api/blog/detail') { // 获取博客详情数据 const result = getDetail(id) // 创建并返回成功模型的 promise 实例对象 return result.then(data => { return new SuccessModel(data) }) } // 新建一篇博客 POST 请求 if (method === 'POST' && req.path === '/api/blog/new') { // 假数据,待开发登录时再改成真实数据 req.body.author = 'zhangsan' // req.body 用于获取请求中的数据(用在 POST 请求中) const result = newBlog(req.body) // 创建并返回成功模型的 promise 实例对象 return result.then(data => { return new SuccessModel(data) }) } // 更新一篇博客 if (method === 'POST' && req.path === '/api/blog/update') { // 传递两个参数 id 和 req.body 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 = handleBlogRouter

user.js 文件

用户登录相关路由调用控制器中的方法// 导入用户登录内容const { loginCheck } = require('../controller/user')// 导入成功和失败的模板const { SuccessModel, ErrorModel } = require('../model/resModel')// user 路由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四、各个接口的测试

查询博客列表

【Node.js实战】一文带你开发博客项目(API 对接 MySQL)(node.js教程详细)

通过关键字查询博客(模糊查询)

通过关键字查询博客(精准查询)

通过id获取博客详情

通过 ApiPost/Postman 工具测试 新建博客

通过 ApiPost/Postman 工具测试 更新博客

通过 ApiPost/Postman 工具测试 删除博客

通过 ApiPost/Postman 工具测试 登录

四、写在最后(附源码)

至此,开发博客的项目(API 对接 MySQL)就完成了。

后续会对该项目进行多次重构【多种框架(express,koa)和数据库(mysql,sequelize,mongodb)】

如果你需要该项目的 源码,请通过本篇文章最下面的方式 加入 进来~~

本文链接地址:https://www.jiuchutong.com/zhishi/300186.html 转载请保留说明!

上一篇:此战成硕,我成功上岸西南交通大学了~~~

下一篇:React中useReducer的理解与使用(react usereducer)

  • oppo手机纯净模式在哪里(oppo手机纯净模式在哪里打开)

    oppo手机纯净模式在哪里(oppo手机纯净模式在哪里打开)

  • reno7后面会发光吗(opporeno5后壳发光)

    reno7后面会发光吗(opporeno5后壳发光)

  • 微信聊天记录能同步吗(微信聊天记录能保存多久)

    微信聊天记录能同步吗(微信聊天记录能保存多久)

  • 12v60ah充电电流和时间(12v60ah450a充电电流)

    12v60ah充电电流和时间(12v60ah450a充电电流)

  • 微信什么也没干就封了(微信什么也没干就给我封号了怎么回事)

    微信什么也没干就封了(微信什么也没干就给我封号了怎么回事)

  • 微信如何把图片拼接在一起(微信如何把图片存成表情包)

    微信如何把图片拼接在一起(微信如何把图片存成表情包)

  • 蓝牙耳机放在盒子里就可以充电了吗(蓝牙耳机放在盒子里灯一直亮红灯)

    蓝牙耳机放在盒子里就可以充电了吗(蓝牙耳机放在盒子里灯一直亮红灯)

  • 支付宝外卖免密支付怎么关闭(支付宝点外卖免密码支付怎么取消)

    支付宝外卖免密支付怎么关闭(支付宝点外卖免密码支付怎么取消)

  • switch长期没充电充不进了(switch长期没充电充很久)

    switch长期没充电充不进了(switch长期没充电充很久)

  • ipv6将32位地址空间扩展到多少位(ipv6将32位地址空间扩张到)

    ipv6将32位地址空间扩展到多少位(ipv6将32位地址空间扩张到)

  • 淘宝代销和分销的区别(在淘宝分销跟代发是一样的吗)

    淘宝代销和分销的区别(在淘宝分销跟代发是一样的吗)

  • iphonexs是高通基带吗

    iphonexs是高通基带吗

  • 微信朋友圈中间留空白(微信朋友圈中间一个月亮)

    微信朋友圈中间留空白(微信朋友圈中间一个月亮)

  • TP-LINK无线桥接失败怎么回事(tp-link无线桥接设置)

    TP-LINK无线桥接失败怎么回事(tp-link无线桥接设置)

  • 苹果11动态壁纸怎么没有声音(苹果11动态壁纸声音怎么打开)

    苹果11动态壁纸怎么没有声音(苹果11动态壁纸声音怎么打开)

  • 银河奇异果是不是爱奇艺(银河奇异果是不是爱奇艺会员)

    银河奇异果是不是爱奇艺(银河奇异果是不是爱奇艺会员)

  • qq卸载了聊天记录还在吗(qq卸载了聊天记录没有了怎么恢复)

    qq卸载了聊天记录还在吗(qq卸载了聊天记录没有了怎么恢复)

  • realme x2能登录oppo账号吗(realme可以用oppo的游戏账号登录吗)

    realme x2能登录oppo账号吗(realme可以用oppo的游戏账号登录吗)

  • 如何删除京东评价中心记录(如何删除京东评价晒单)

    如何删除京东评价中心记录(如何删除京东评价晒单)

  • 抖音的密码怎么解(抖音的密码怎么放)

    抖音的密码怎么解(抖音的密码怎么放)

  • 苹果xr和8p参数对比(苹果xr和8p参数配置)

    苹果xr和8p参数对比(苹果xr和8p参数配置)

  • vsco怎么算订阅成功(vsco订阅不了)

    vsco怎么算订阅成功(vsco订阅不了)

  • 充电到84充不进去了(充电充到84为什么充不动)

    充电到84充不进去了(充电充到84为什么充不动)

  • 为什么我的快手没有同框(为什么我的快手放映厅没有电影)

    为什么我的快手没有同框(为什么我的快手放映厅没有电影)

  • 阿里小宝卡抖音免流吗(阿里小宝卡抖音直播免流吗)

    阿里小宝卡抖音免流吗(阿里小宝卡抖音直播免流吗)

  • 开机提示“bootmgr is missing”怎么办?(开机提示lsass应用程序出错)

    开机提示“bootmgr is missing”怎么办?(开机提示lsass应用程序出错)

  • 马蹄莲的养殖方法(马蹄莲的养殖方法和注意事项视频)

    马蹄莲的养殖方法(马蹄莲的养殖方法和注意事项视频)

  • 织梦数据库实现调用顶级二级栏目及下三级栏目方法(织梦数据库在哪)

    织梦数据库实现调用顶级二级栏目及下三级栏目方法(织梦数据库在哪)

  • 固定资产清理费用计入哪里
  • 会计分录的含义及三要素
  • 个人去税务局开专票需要提供什么
  • 销项发票导出格式不对怎么办
  • 工资个税计提多了实际交的少
  • 单位注册表从哪里获取
  • 外地企业如何在本地纳税
  • 享受专项附加扣除该怎么申报
  • 买金税盘发票能全额抵进项税吗
  • 哪些纳税人不得办理一般纳税人登记
  • 收回多缴税金会计分录
  • 我国现行资源税的课税范围不包括
  • 净资产利润率等于净资产收益率吗
  • 17%增值税发票怎么计算成13%
  • 钱汇错需要退回应该怎么做分录?
  • 违约金抵扣货款等于现金折扣吗会计分录
  • 应纳税所得额数学
  • 预征税额是什么意思
  • 国外客户要求退货
  • 税控盘年费每年都可以抵扣吗
  • 财务费用为负数怎么结转
  • 材料票可以直接在税务局开吗
  • 建筑服务工程款会计分录
  • 工会经费返还账务处理,另记账么
  • 免征增值税转入什么科目
  • 加班工资是否属劳动关系
  • 股东收回投资款的现金流量
  • Win11系统怎么更换桌面壁纸
  • 负债率是什么指标
  • 备孕男的要吃叶酸吗? 已解决
  • 跨年的收入可以在次年冲吗
  • 羊毛衫变形了还能变回来吗
  • 确定无形资产使用寿命时应当考虑的因素有
  • PHP:Memcached::getMulti()的用法_Memcached类
  • PHP:iterator_count()的用法_spl函数
  • 出口货物免抵退税 组织收入 影响
  • 雄性和雌性的匹配
  • 如何防止电子发票重复报销
  • 稳岗补贴支付范围
  • php的session
  • 土地使用权的折旧年限和折旧方法
  • ps怎么把文字单独抠出来
  • 固定资产转为投资性房地产公允价值
  • 小规模超500万升一般纳税人规定
  • 小规模工程服务开票几个点
  • 金蝶系统采购发票
  • 配置windows update
  • 存货的入账价值等于
  • 托收承付和委托收款区别
  • 怎么才能不开发票
  • 简易征收的项目进项税可以抵扣吗
  • 出口退税没有及时申报
  • 未开票确认收入账务处理
  • 银行收到客户货款会计分录
  • 金税盘不申报会不会罚款
  • 营业收入和主营业务收入分别在哪看
  • SQLServer XML查询快速入门(18句话)
  • mysql查询结果输出
  • 三星电脑安装系统为什么进入不了安装页面
  • win8.1系统升级win10
  • win10右键菜单怎么设置
  • Windows 2003作中转VPN服务器多路由共享上网的方法
  • mac变得很卡很慢
  • macbook 手写
  • win8系统怎么做系统
  • linux怎么和window系统共用
  • 双击windows 7桌面上的快捷图标可以干嘛
  • win10的帮助系统在哪
  • opengl 旋转矩阵
  • jquery炫酷效果
  • jsp生成uuid
  • javascript的sort
  • python生成txt文档
  • 探探左划还是右划
  • javascript内置对象window
  • python系统框架
  • 税控盘登陆失败
  • 税的几个点是什么意思
  • 代理记账公司成本怎样结转的
  • 商住两用房出售要交契税吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设