Node.js-NodeServer
2020-05-18 13:58:14 4 举报
AI智能生成
纯NodeJs做的一个博客系统。包含的核心知识:nodejs处理http, 处理路由, sql;cookie , session, redis, nginx 反向代理;sql注入,XSS, 加密;日志: stream, crontab, readline。
作者其他创作
大纲/内容
数据存储
mysql
mysql workbench
数据库操作
创建数据库 myblog
column
名字
datatype
int
bigint
varchar
字符串
longtext
4G
pk
主键
nn
不能为空
AI 自动增加
增删改查
use myblog;
show tables;
-- insert into users(username, `password`, realname) values ('lisi', '123', '李四');
-- select * from users;
-- select id, username from users;
-- select * from users;
-- select id, username from users;
select * from users where username='zhangsan' or `password`='123';
select * from users where `password` like '%1%' order by id desc;
降序
update
delete
总结
如何建库 、如何建表
建表是常用的数据类型
数据库的增删改查
总结
nodejs连接mysql, 如何执行sql语句
根据NODE_ENV区分环境配置
疯转exec函数,API 使用exec 操作数据库
登录
核心
登录校验
登录存储
cookie
最大5kb
存储在浏览器端的一个字符串
跨域不共享
每次发送http请求,会将cookie传给server
server可以修改cookie,再返回给浏览器
浏览器可以修改cookie
js 操作cookie
server端修改cookie
cookie做限制
session
用cookie的问题:会暴露username,很危险
如何解决:cookie中存放userid, 对应server端的username
解决方案:session,即server端存储用户信息
目前存在的问题:
目前session直接是js变量,放在nodejs进程内存中
进程内存有限,访问量过大,内存暴增怎么办
正式线上运行是多进程,进程之间内存无法共享
redis
特点
Web Server最常用的缓存数据库,数据存放在内存中
内存读写特别快
但是比较昂贵
内存容易丢失
相比于mysql,访问速度快
成本更高,可存储的数据量小
安装
brew install redis
redis-server
redis-cli
host
port
用法
set myname qianqian
设置
get myname
获取
keys *
所有的
del myname
删除
nodejs连接redis
demo
和前端联调
方案
登录依赖于cookie ,必须用浏览器来联调
cookie跨域不共享
联调
npm install http-server -g
http-server -p 8001
nginx
一般用于做静态服务,负载均衡
反向代理
总结
cookie是什么?session是什么?如何实现登录
redis在这里扮演什么角色?有什么核心的价值?
nginx的反向代理配置,联调过程中的作用
日志
介绍
系统没有日志,就等于人没有眼睛 -- 抓瞎
第一,访问日志 access log (servers端最重要的日志)
第二、自定义日志(包括自定义事件,错误记录等)
目录
nodejs操作文件, nodejs stream
读取
fs.readFile(fileName, (err, data) => {})
写入
fs.writeFile(fileName, content, opt, err => { })
是否存在
fs.exists(fileName, exsit => { })
IO 操作的性能瓶颈
相比于CPU的操作,IO特点就是慢
如何在有限 的硬件资源下,提高性能
process.stdin.pipe(process.stdout)
请求
stream 实现copy文件
readStream
fs.createReadStream(fileName1)
writeStream
fs.createWriteStream(fileName2)
写日志
日志功能的开发和使用
日志文件拆分,日志内容分析
拆日志
按时间拆分
实现方式:linux的crontab命令,即定时任务
设置定时任务:*****command
min hour day 星期
子主题
将access.log copy出来,并重命名 2020-08-01.access.log
清空access.log, 继续积累日志
示例
定时任务
crontab -e
i :开始编辑 vim
* 0 * * * sh /Users/zhourongjing/Documents/node-learn/blog-1/src/utils/copy.sh
crontab -l
可以看到任务列表
日志分析
如针对access.log chrome的访问占比
日志是按行存储,一行就是一条日志
使用nodejs的readline(基于stream,效率非常高)
安全
sql注入:窃取数据库内容
输入一段sql代码,最后拼接成一段攻击代码
select username, realname from users
where username='zhangsan';delete from users;-- ' and password='123'
where username='zhangsan';delete from users;-- ' and password='123'
删除了表
select username,realname from users
where username='zhangsan' -- ' and password='123';
where username='zhangsan' -- ' and password='123';
不需要密码就登录了
预防措施:mysql.escape
XSS攻击:窃取前端的cookie内容
在页面展示内容中掺杂js代码,获取页面内容
预防措施:转化生成js的特殊字符串
& -> &
< -> <
> -> >
" -> "
' -> '
/ -> /
密码加密:保障用户信息安全
攻击方式:获取用户名和密码,再去尝试登录其他的系统
总结
开发了哪些模块,实现了哪些功能
处理http接口
路由
postData
cookie
连接数据库
实现登录
日志
安全
用到了哪些核心的知识点
nodejs处理http, 处理路由, sql
cookie , session, redis, nginx 反向代理
sql注入,XSS, 加密
日志: stream, crontab, readline
回顾“Server”端和前端的区别
服务端稳定性
内存CPU (优化 扩展)
优化 stream
扩展 redis
日志记录
安全(包含登录校验)
集群和服务拆分(设计已支持)
path
process.cwd() 当前执行程序的路径(执行命令行时候的路径,不是代码路径 例如 在根目录下执行 node ./xxx/xxx/a.js 则 cwd 返回的是 根目录地址
__dirname: 代码存放的位置
process.execPath: 当前执行的node路径(如:/bin/node)
一、课程导读
Nodejs的真正用途
Nodejs,一个javascript的运行环境
运行在服务器,作为一个web server
运行在本地,作为打包、 构建工具
二、nodejs介绍
安装
普通安装
NVM
Node Version Manager
brew install nvm
nvm -v
nvm list
nvm use --delete-prefix 8.12.0
Nodejs跟js的区别
ECMAScript
定义了语法,js跟nodejs都必须遵守
变量定义,循环、判断、函数
原型和原型链、作用域和闭包、异步
javascript
使用es的规范,外加Web API, 缺一不可
DOM操作,BOM操作,事件,ajax等
两者结合,可以再浏览器做任何操作
nodejs
使用es的规范,外加nodejs API ,缺一不可
处理http,文件
两者结合,可以完成server端的任何操作
commonJS
模块化开发
debugger
"main": "index.js"
main参数指定了才能debugger
http
发送请求
server端和前端的区别
server
服务稳定性
可能会遭受各种恶意攻击和误操作
单个客户端可以意外挂掉,但是服务端不能
PM2做进程守候
考虑内存和CPU (优化、扩展)
stream写日志,使用redis写session
日志记录
安全
集群和服务拆分
三、博客项目介绍
目标
需求
首页、作者主页、博客详情页
登录页
管理中心、新建页、编辑页
技术方案
数据如何存储
博客
title
content
createtime
author
用户
username
password
realname
如何与前端对接、接口设计
描述
接口
方法
get
post
url参数
四、开发博客项目之接口
http概述
nodejs处理Http请求
从浏览器输入url到页面显示经历了什么
DNS解析,建立tcp连接,发送http请求
3次握手
server端接受请求,处理并返回
客户端接受到数据,处理数据(渲染页面,执行js)
搭建开发环境
开发接口(暂不链接数据库)
nodejs处理http请求
处理get请求
const quqerystring = require('querystring');
处理post请求
postdata
路由
搭建开发环境
使用nodemon监测文件变化,自动重启node
使用cross-env设置环境变量,兼容linux和windows
开发接口
初始化路由
返回假数据
将路由和数据处理分离
开发路由
method
path
项目结构
www.js
项目的入口:httpServer, port, listening
app.js
系统的处理
header
path
query
路由引入
src
router
blog.js
user.js
controller
只关心数据
model
promise
callback-hell
promise.then之后还是一个promise
但是值需要前面return过来
总结
nodejs处理http请求的常用技能,postman的使用
nodejs开发博客项目的接口(未连接数据库,未使用登录)
为何要将 router 和 controller 分开
router
只管路由
数据格式一样
message
errorno
controller 只处理数据
补充:路由 和 API
API
前端和后端,不同端(子系统)之间对接的一个术语
url(路由)'/api/blog/list' get 输入、输出
路由
API的一部分
后端系统的一个定义
0 条评论
下一页