Node.js——博客系统

文章目录

  • Node.js——博客系统
    • Node.js 的真正用途
    • 学习 Node.js 的困惑
    • Node.js 安装
      • node.js 和 javascript 的区别
      • server 开发和前端开发的区别
    • 博客项目介绍
      • 目标
      • 需求
      • 技术方案
    • 开发接口(不用任何框架)
      • 搭建开发环境
      • 开发接口
    • MySql
      • mysql 介绍、安装和使用
      • 操作数据库
      • node.js 连接 mysql
      • API 连接 mysql
    • 登录
      • cookie 和 session
      • session 写入 redis
      • 开发登录功能,和前端联调(用到 nginx 反向代理)
    • 日志
    • 安全
  • express


Node.js——博客系统

Node.js 的真正用途

  1. Node.js,一个 javascript 的运行环境
  2. 运行在服务器,作为 web server
  3. 运行在本地,作为打包、构建工具

学习 Node.js 的困惑

  1. Node.js 运行在服务端,而非浏览器环境
  2. 服务端开发的思路和套路,与前端完全不一样

Node.js 安装

Windows 系统环境安装 Node.js 参考:https://blog.csdn.net/longestory/article/details/108742759?utm_source=app

MacOS 系统环境安装 Node.js 参考:
https://blog.csdn.net/longestory/article/details/108742936?utm_source=app

nvm 安装和管理多版本 Node.js 参考:
https://blog.csdn.net/longestory/article/details/108743099?utm_source=app

Node.js——博客系统_第1张图片

node.js 和 javascript 的区别

ECMAScript(定义了语法规范)

javascript(使用 ECMAScript 语法规范,外加 Web API)

node.js(使用 ECMAScript 语法规范,外加 node.js API)


common.js

npm init -y:初始化

debugge:调式

server 开发和前端开发的区别

  • 服务稳定性
  • 考虑内存和 CPU (优化,扩展)
  • 日志记录
  • 安全
  • 集群和服务拆分

博客项目介绍

目标

  • 博客系统,具有博客的基本功能
  • 只开发 server 端,不关心前端

需求

  • 首页,作者主页,博客详情页
  • 登录页
  • 管理中心,新建页,编辑页

技术方案

  • 数据如何存储(博客,用户)
  • 如何与前端对接,即接口设计

开发接口(不用任何框架)

  1. node.js 处理 http 请求
  2. 搭建开发环境
  3. 开发接口

DNS 解析,建立 TCP 连接,发送 http 请求

server 接收到 http 请求,处理,并返回

客户端接收到返回数据,处理数据(渲染页面,执行 js)

get 请求和 querystring

post 请求和 postdata,客户端要向服务端传递数据(postman)(安装软件,可以测试请求的数据)

路由

搭建开发环境

使用 nodemon 监测文件变化,自动重启 node

使用 cross-env 设置环境变量,兼容 mac linux 和 windows

npm i nodemon cross-env --save-dev

开发接口

初始化路由:根据之前技术方案的设计,做出路由

返回假数据:将路由和数据处理分离,以符合设计原则

Node.js——博客系统_第2张图片

router:处理路由

controller:处理数据

MySql

mysql 介绍、安装和使用

  • web server 中最流行的关系型数据库
  • 官网可免费下载,用于学习
  • 轻量级,易学易用

官网下载地址:
https://dev.mysql.com/downloads/mysql/

workbench

操作 mysql 的客户端,可视化操作

下载地址:workdown

操作数据库

CREATE DATABASE myblog:创建一个名为 myblog 的数据库

CREATE TABLE users:创建一个名为 users 的表

insert into users (username,password,realname) values ('haha','123456789','哈哈');:插入

select * from users;:查询所有

select * from users where username='haha' and realname='哈哈';:多条件查询

select * from users where realnamelike '%哈哈%';:模糊查询

select * from users where password like '%123%' order by id desc;:查到的结果倒序排列

update users setpassword='123' where username='wuwu';:修改

update blogs set author='xixi' where title='标题B';:修改 author 为 xixi

delete from users where username='haha';:删除 username 为 haha 的数据

update users set state='0' where username='haha';软删除,牢记,修改 username 为 haha 的 state 为 0,

show databases;

node.js 连接 mysql

如果遇到错误ER_NOT_SUPPORTED_AUTH_MODE,解决方法:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';(在 mysql 中执行)

错误原因:密码的加密方式

cross-env

npm run dev

API 连接 mysql

保证 server 端的安全性

mysql模块安装:npm i mysql

登录

核心:登录校验 & 登录信息存储

cookie 和 session

cookie

  • 存储在浏览器的一段字符串(最大 5kb)
  • 跨域不共享
  • 格式如 k1=v1;k2=v2;k3=v3; 因此可以存储结构化数据
  • 每次发送 http 请求,会将请求域的 cookie 一起发送给 server
  • server 可以修改 cookie 并返回给浏览器
  • 浏览器中也可以通过 javascript 修改 cookie(有限制)

客户端 javascript 操作 cookie

  • 客户端查看 cookie,三种方式,开发者工具(Network、Application)、浏览器控制台(document.cookie)
  • javascript 查看、修改 cookie(有限制)

server 端 node.js 操作 cookie

  • 查看 cookie
  • 修改 cookie
  • 实现登录验证

解决乱码:res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});

cookie 的问题:暴露 username,很危险

解决:cookie 中存储 userid,server 端对应 username

session,即 server 端存储用户信息

session 写入 redis

session 的问题:目前 session 直接是 js 变量,放在 node.js 进程内存中;进程内存有限,访问量过大,内存暴增怎么解决;正式线上运行是多进程,进程之间内存无法共享

redis

  • web server 最常用的缓存数据库,数据存放在内存中
  • 相比于 mysql,访问速度快(内存和硬盘不是一个数量级的)
  • 成本更高,可存储的数据量更小(内存的硬伤)

将 web server 和 redis 拆分为两个单独的服务

双方都是独立的,都是可扩展的(例如都扩展成集群)

(包括 mysql,也是一个单独的服务,也可扩展)

session 适用 redis:session 访问频繁,对性能要求极高;session 可不考虑断电丢失数据的问题(内存的硬伤);session 数据量不会太大(相比于 mysql 中存储的数据)

网站信息不适用 redis:操作频率不是太高(相比于 session 操作);断电不能丢失,必须保留;数据量太大,内存成本太高

redis 安装(windows):

操作:cmd 中

redis-server.exe redis.windows.conf:启动 redis 服务;

窗口不要关,再新开一个 cmd 窗口;redis-cli:登录 redis

redis模块安装:npm i redis

开发登录功能,和前端联调(用到 nginx 反向代理)

登录功能依赖 cookie,必须用浏览器来联调

cookie 跨域不共享的,前端和 server 端必须同域

需要用到 nginx 做代理,让前后端同域

http-server模块安装:npm i http-server

nginx

  • 高性能的 web 服务器,开源免费
  • 一般用于做静态服务负载均衡
  • 反向代理

nginx 下载:官网下载:(稳定版)

nginx 配置 很重要

日志

系统没有日志,就等于人没有眼睛——抓瞎

第一,访问日志 access.log(server 端最重要的日志)

第二,自定义日志(包括自定义事件、错误记录等)

node.js 文件操作,node.js stream

日志功能开发和使用

日志文件拆分,日志内容分析

IO 操作的性能瓶颈

IO 包括“网络 IO”和“文件 IO”

相比于 CPU 计算和内存读写,IO 的突出特点就是:慢

如何在有限的硬件资源下提高 IO 的操作效率?stream

日志内容会慢慢积累,放在一个文件中不好处理

按时间划分日志文件,如 2020-10-21.access.log

实现方式,使用 crontab 拆分日志文件,使用 readline 分析日志内容

安全

sql 注入:窃取数据库内容(解决:escape)

XSS 攻击:窃取前端的 cookie 内容

密码加密:保障用户信息安全(重要)

Node.js——博客系统_第3张图片 Node.js——博客系统_第4张图片 Node.js——博客系统_第5张图片

express

express 是 node.js 最常用的 web server 框架

如果遇到错误about_Execution_Policies,参照

你可能感兴趣的:(node.js)