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

这篇具有很好参考价值的文章主要介绍了【Node.js实战】一文带你开发博客项目(API 对接 MySQL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人简介

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

Node.js系列文章目录

内容 参考链接
Node.js(一) 初识 Node.js
Node.js(二) Node.js——开发博客项目之接口
Node.js(三) Node.js——一文带你开发博客项目(使用假数据处理)
Node.js(四) Node.js——开发博客项目之MySQL基础


一、前言

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

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

二、Node.js 连接 MySQL

安装 MySQL

npm install mysql

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

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

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

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 文件,用于存放一些数据

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

mysql.js 文件

  • 引入 mysql 和连接数据库
  • 封装 sql 函数,用于统一执行
// 引入 MySQL
const 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 对接 MySQL

1、文件目录

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

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

四、各个接口的测试

查询博客列表

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


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

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


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

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


通过id获取博客详情

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


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

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

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

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

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

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql

通过 ApiPost/Postman 工具测试 登录

nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql


四、写在最后(附源码)

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

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

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


nodejs操作mysql的api,node.js+express+koa2博客项目,node.js,前端,javascript,mysql文章来源地址https://www.toymoban.com/news/detail-784299.html

到了这里,关于【Node.js实战】一文带你开发博客项目(API 对接 MySQL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Node.js实战】一文带你开发博客项目之Koa2重构(实现session、开发路由、联调、日志)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力n年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝

    2024年01月16日
    浏览(50)
  • 【Node.js实战】一文带你开发博客项目之安全(sql注入、xss攻击、md5加密算法)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀 未来打算: 为中国的工业软件事业效力n年 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝

    2024年02月03日
    浏览(52)
  • 【Node.js】一文带你开发博客项目之接口(处理请求、搭建开发环境、开发路由)

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,也会涉及到服务端 📃 个人状态: 在校大学生一枚,已拿 offer(秋招) 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2Vue3项目实战 🥝Node.js 内容 参考链接 Node.js(一) 初识 Node.js DNS 解析,建

    2023年04月21日
    浏览(55)
  • Node.js博客项目开发思路笔记

    开发一个博客系统,具备博客基本功能 只开发 server 端,不关心前端 首页、作者页、博客详情页 登陆页 管理中心、新建页、编辑页 数据如何存储 博客 id title content createtime author 1 标题 1 内容 1 1111112 zhangsan 2 标题 2 内容 2 1111111 lisi 用户 id username password realname 1 zhangsan 123 张三

    2024年02月12日
    浏览(44)
  • 【微信小程序开发】一文带你详解小程序组件和 API 的使用

    在小程序开发中,组件和API是非常重要的部分,它们可以帮助我们构建丰富的用户界面和实现各种功能。本文将介绍小程序中常用的组件和API,并提供相应的代码示例。 小程序的组件是构建用户界面的基本元素。它们可以用于展示数据、接收用户输入、实现交互等。 下面是

    2024年02月12日
    浏览(58)
  • 哈哥的博客阅读指南,一文对接全链路导引 --- 未完待续~

    不知不觉,深耕技术博客已经度过很多时间了~ 技术专栏,社区板块也做了很多,我决定写一篇文章,专门用于指南作为阅读导引,接下来请小伙伴花费十分钟的时间,了解一下该导引指南。 方便各位小伙伴的检索,也方便大家减少信息的筛选成本。除了大家所关心的技术类

    2024年02月09日
    浏览(40)
  • 一文带你了解Java对接soap接口

    soap是一种简单的基于XML的协议:HTTP+RPC+XML A、Envelope(信封)元素,必选,可把此XML文档标识为一条SOAP消息。 B、Header(报头)元素,可选,包含头部信息(包含了使消息在到达最终目的地之前,能够被路由到一个或多个中间节点的信息)。 C、Body(主体)元素,必选,包含所有

    2024年02月08日
    浏览(40)
  • 实战:Docker化Node.js项目

    Docker是一种轻量级的应用容器技术,可以将应用程序及其所有依赖项打包成一个可移植的容器,以便在任何支持Docker的环境中运行。Node.js是一种基于Chrome的JavaScript运行时,可以用于构建高性能和可扩展的网络应用程序。在现代软件开发中,将Node.js应用程序Docker化是一项重要

    2024年02月21日
    浏览(52)
  • Vue.js+Node.js开发实战就业反馈小程序-培训机构学员

     💖💖更多项目资源,最下方联系 IT实战课堂 ✨✨✨✨✨✨ 博主拥有多年的T技术研发项目架构和教学经验,CSDN/51CTO/腾讯课堂等平台优质作者、高级讲师,培训机构联合创始人!现专注项目定制Java、小程序、前端网页、Python、App、NodeJs、PHP、微服务、NET等远程部署、售后答

    2024年02月20日
    浏览(57)
  • 带你了解关于FastAPI快速开发Web API项目中的模板和Jinja

    摘要: FastAPI 实际上是为构建 API 和微服务而设计的。它可用于构建使用 Jinja 提供 HTML 服务的 Web 应用程序。 本文分享自华为云社区《FastAPI 快速开发 Web API 项目: 模板和 Jinja 介绍》,作者:宇宙之一粟。 模板是全栈 Web 开发的重要组成部分。使用 Jinja,您可以构建丰富的模

    2023年04月25日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包