【Node.js实战】一文带你开发博客项目之Express重构(博客的增删查改、morgan写日志)

news2024/11/19 4:19:47

个人简介

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

Node.js系列文章目录

内容参考链接
Node.js(一)初识 Node.js
Node.js(二)Node.js——开发博客项目之接口
Node.js(三)Node.js——一文带你开发博客项目(使用假数据处理)
Node.js(四)Node.js——开发博客项目之MySQL基础
Node.js(五)Node.js——开发博客项目之API对接MySQL
Node.js(六)Node.js——开发博客项目之登录(前置知识)
Node.js(七)Node.js——开发博客项目之登录(对接完毕)
Node.js(八)Node.js——开发开发博客项目之联调
Node.js(九)Node.js——开发博客项目之日志
Node.js(十)Node.js——开发博客项目之安全
Node.js(十 一)Node.js——开发博客项目之初识 Express
Node.js(十二)Node.js——开发博客项目之 Express 重构

文章目录

  • Node.js系列文章目录
    • 一、前言
    • 二、对博客的增删查改
      • 1、登录中间件
      • 2、开发路由
      • 3、测试
    • 二、使用 morgan 写日志
    • 三、写在最后


一、前言

上一篇文章,我们对 myblog 项目进行了 Express 的初步重构。

接下来,我们来了解一下路由的开发,Morgan写日志,并学习一下中间件原理!

二、对博客的增删查改

1、登录中间件

我们在 blog-express 目录下创建 middleware 文件夹,专门用于写中间件

在这里插入图片描述

loginCheck.js

引入失败的模型,如果已经登录则 next(),若没有登录则失败未登录

const { ErrorModel } = require('../model/resModel')

module.exports = (req, res, next) => {
    // 已经登录
    if (req.session.username) {
        next()
        return
    }

    res.json(
        new ErrorModel('未登录')
    )
}

2、开发路由

我们借助刚刚写好的登录中间件,去完善我们的博客路由

blog.js

我们使用 express 提供给我们的方式去完善路由,从而实现相应的功能

var express = require('express');
var router = express.Router();
// 导入博客和用户控制器相关内容
const {
  getList,
  getDetail,
  newBlog,
  updateBlog,
  delBlog
} = require('../controller/blog')
// 导入成功和失败的模型
const {
  SuccessModel,
  ErrorModel
} = require('../model/resModel')

const loginCheck = require('../middleware/loginCheck')

// 博客列表
router.get('/list', (req, res, next) => {
  // 博客的作者,req.query 用在 GET 请求中
  let author = req.query.author || ''
  // 博客的关键字
  const keyword = req.query.keyword || ''

  if (req.query.isadmin) {
    // 管理员界面
    if (req.session.username == null) {
      // 未登录
      res.json(
        new ErrorModel('未登录')
      )
      return
    }
    // 强制查询自己的博客
    author = req.session.username
  }

  // 查询的结果
  const result = getList(author, keyword)
  return result.then(listData => {
    res.json(
      new SuccessModel(listData)
    )
  })
});

// 博客详情
router.get('/detail', (req, res, next) => {
  const result = getDetail(req.query.id)
  return result.then(data => {
    res.json(
      new SuccessModel(data)
    )
  })
});

// 新增博客 loginCheck 作为中间件
router.post('/new', loginCheck, (req, res, next) => {
  req.body.author = req.session.username
  const result = newBlog(req.body)
  return result.then(data => {
    res.json(
      new SuccessModel(data)
    )
  })
})

// 更新博客
router.post('/update', loginCheck, (req, res, next) => {
  const result = updateBlog(req.query.id, req.body)
  return result.then(val => {
    if (val) {
      res.json(
        new SuccessModel()
      )
    } else {
      res.json(
        new ErrorModel('更新博客失败')
      )
    }
  })
})

// 删除博客
router.post('/del', loginCheck, (req, res, next) => {
  const author = req.session.username
  const result = delBlog(req.query.id, author)
  return result.then(val => {
    if (val) {
      res.json(
        new SuccessModel()
      )
    } else {
      res.json(
        new ErrorModel('删除博客失败')
      )
    }
  })
})

module.exports = router;

3、测试

下面我们成功测试完毕。至此,使用 express 重构的 myblog 项目的增删改查就告一段落了,接下来我们来学习一下日志功能。

在这里插入图片描述


在这里插入图片描述




在这里插入图片描述



二、使用 morgan 写日志

morgan 官网

里面介绍了一些不同类型(dev,combined等)的日志的格式

在这里插入图片描述

在这里插入图片描述

首先,我们新建专门存放日志的文件夹和 access.log 文件

在这里插入图片描述

之后,我们修改 package.json 文件,添加一行启动项(prd)

package.json

  "scripts": {
    "start": "node ./bin/www",
    "dev": "cross-env NODE_ENV=dev nodemon ./bin/www",
    "prd": "cross-env NODE_ENV=production nodemon ./bin/www"
  },

我们在 app.js 文件中导入必要的模块,之后按照 开发环境 / 线上环境 进行区分

app.js

var path = require('path');
var fs = require('fs');
......
const ENV = process.env.NODE_ENV
if (ENV !== 'production') {
  // 开发环境 / 测试环境
  app.use(logger('dev'))
} else {
  // 线上环境使用 combined(写入文件)
  const logFileName = path.join(__dirname, 'logs', 'access.log')
  const writeStream = fs.createWriteStream(logFileName, {
    flags: 'a'
  })
  app.use(logger('combined', {
    stream: writeStream
  }));
}

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


三、写在最后

至此,我们明白了 如何使用 Express 框架对我们的 myblog 项目进行进一步的重构(增删查改,使用 morgan 写日志), 继续跟进学习吧!

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

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


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/191791.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java之并发编程(二)

二、Java内存模型(重要) 1. CPU缓存模型 1.1 CPU缓存 CPU缓存是为了解决 CPU处理速度和内存处理速度不对等的问题。(类比:缓存如Redis是为了解决程序处理速度和访问常规关系型数据库速度不对等的问题) 内存缓存是为…

UDS诊断系列介绍16-DTC状态位介绍

本文框架1. 系列介绍2.各状态位逻辑介绍2.0 Bit0(TestFailed)置位逻辑2.1 Bit1(TestFailedThisOperationCycle)置位逻辑2.2 Bit2(PendingDTC)置位逻辑2.3 Bit3(ConfirmedDTC)置位逻辑2.4 Bit4(TestNotCompletedSinceLastClear)置位逻辑2.5 Bit5(TestFailedSinceLastClear)置位逻…

网站排名下降怎么恢复(网站降权的原因如何知道)

网站降权后恢复网站排名的方法 对于我们很多SEO新手来说,降权可能是不可避免的,但很多时候是因为我们的无知或粗心大意导致网站降权,从延长排名周期到导致网站进入沙盒效应,所以我们的网站降权后并非无法恢复。很多时候&#xff…

【逆向分析】静态分析_Navtive_小计

静态分析so小计 源APK https://github.com/eternalsakura/ctf_pwn/blob/master/android%E9%80%86%E5%90%91/mobicrackNDK.apk jadx 通过源码发现关键函数在 public native boolean testFlag(String str);static {System.loadLibrary("mobicrackNDK");}所以要看na…

【C++】入门(上)

本期博客给大家带来的全是干货,慢慢享用吧~C入门主要是一些对C语言不足的语法补充,废话不多说直接上干货:一、C的输出和输入1.1 输出在C上我们要想在屏幕(控制台)上进行一些内容的输出可以使用关键字:cout具…

MoCo解读

MoCo方法由何凯明团队提出,是无监督对比学习的代表作。经过MoCo预训练的视觉表征迁移到各种下游任务时,其效果超过了有监督预训练模型。 两点创新 对比学习的思想是将相似的样本距离拉近,不相似的样本距离拉远。对比学习主要在两方面进行设计…

JavaEE13-MyBatis查询数据库

前言:前面已经学习了Spring,Spring Boot,Spring MVC这3个框架,接下来学习第4个框架MyBatis(国内):将前端传递的数据存储起来(前身IBatis)或者查询数据库里面的数据。PS:不同版本号区别3.5.1 -> 3.5的第一个版本3.5.10 -> 3.…

命令执行利用

数据来源 01 命令执行漏洞 命令执行漏洞- 例子1(无防御) 示例:(我这里使用dvwa靶场做演示) 解决靶场响应结果的中文乱码 charsetutf-8,修改为charsetgb2312 把安全等级调到:low&#xff0…

concat函数在mySQL和Oracle中的不同

在mysql中的使用1>.在该函数中传入两个值:22和33,得到结果为两个值的拼接效果如图所示2>.在该函数中传入两个及以上的值:22和33和44,得到结果为多个值的拼接效果如图所示3>.在该函数中传入两个及以上的值:null和22和33,得…

GitHub 上有哪些优秀的项目?

前言 各个领域模块的都整理了一下,包含游戏、一些沙雕的工具、实用正经的工具以及一些相关的电商项目,希望他们可以给你学习的路上增加几分的乐趣,我们直接进入正题~ 游戏 1.吃豆人 一款经典的游戏开发案例,包括地图绘制、玩家控…

车载网络 - BootLoader - CAN/CANFD刷写过程

话接上回,我们继续分享刷写流程。 刷写Boot到RAM(如果ECU中有独立的boot代码,无需执行此段) 9、获取单次刷写的最大长度(参考https://mp.csdn.net/mp_blog/creation/editor/127720716) Request:34 00 44 + 地址 + 长度 Response:74 00 44 + Maxlength 10、进行刷写传…

Netty之DefaultAttributeMap与AttributeKey的机制和原理

为什么要分析DefaultAttributeMap和AttributeKey呢?我自己对Netty也是一个不断的学习过程,从前面几篇Netty分析的博客中,可以看出,Netty是比较博大精深的,很像java.util.concurrent.*包中的源码,如果只是看…

【微电网】微电网的分布式电源优化配置研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

企业工程管理系统源码-专注项目数字化管理

高效的工程项目管理软件不仅能够提高效率还应可以帮你节省成本提升利润 在工程行业中,管理不畅以及不良的项目执行,往往会导致项目延期、成本上升、回款拖后,最终导致项目整体盈利下降。企企管理云业财一体化的项目管理系统,确保项…

关于卷积过程中通道数如何变化问题

以RGB图像为例。 一个12*12的像素图,对其进行5*5的卷积,最后得到一个8*8【计算过程:(12-5)/118】的像素图。 RGB图像有3个通道(12*12*3),所以卷积核也要有3个通道(5*5*3)&am…

第一章 隐私计算科普与解读

前言 提醒:全文10千字,预计阅读时长15分钟;读者:对隐私计算感兴趣的小伙伴;目的:读者利用15~30 分钟对本文沉浸式阅读理解,能够掌握隐私计算 80% 的概念;关键词 :隐私计算…

好用的搜索工具listary

发现一个好工具记录一下。以后好好用起来。 这个工具我安装后,跟着引导教程,学做了一些操作立马就爱上了。 Listary:大幅度提高本地文件浏览与搜索速度效率的「超级神器」 百度安全验证https://baijiahao.baidu.com/s?id17127561426219890…

【Python】基于you-get下载网页视频

文章目录1 前言2 you-get2.1 安装2.2 简单使用2.3 扩展3 下载网页视频3.1 概述3.2 下载网页4 代码1 前言 过年了,想给家里长辈下几首戏曲,于是找到一个发布戏曲的网站,虽然可以通过IDM插件的资源嗅探来一一下载,但是内容太多&…

【JavaScript】数据劫持详解

💻 【JavaScript】数据劫持 🏠专栏:JavaScript 👀个人主页:繁星学编程🍁 🧑个人简介:一个不断提高自我的平凡人🚀 🔊分享方向:目前主攻前端&#…

这就是传说中超难的N皇后?——详细图解!

✔️本文主题:回溯算法之N皇后 算法 ✔️题目链接:N皇后 详解N皇后一、前言二、题目信息三、解题思路四、参考代码五、结语一、前言 大家好久不见,今天我们一起来学习一道很经典、也很有难度的一道题目——N皇后 二、题目信息 按照国际象棋…