使用Node开发后端项目

一、Node简单介绍

1、Node用途

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

  1. 运行在服务器,作为web server
  2. 运行在本地,作为打包、构建工具

2、下载和安装

  1. 普通下载

按照node官网下载即可。
2. NVM下载
NVM,node的版本管理工具,可切换多个node版本。
github搜索 nvm-windows,按照步骤下载即可。
使用NVM之前,需将之前已经独立安装的node版本卸载。后续都通过NMM管理node版本。

nvm list //查看已存在的node版本
nvm install 8.0.0 //安装node版本
nvm use 8.0.0 //切换node版本环境
nvm uninstall 8.0.0 //卸载
复制代码

3、Node.js和JavaScript的区别

  1. JavaScirpt

包括ECMAScript语法规范和Web API。
两种结合,才能实现页面的各种操作。
Javascript组成.png
2. Node.js
包括ECMAScript语法规范和Node.js API。
两种结合,才能完成server端的任何操作。
Node组成.png

4、Common.js 和debugger

5、 server端和前端的区别

server端的考虑点:

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

server端可能会遭受各种恶意攻击或者误操作;
PM2进场守候
2. 考虑内存和CPU(优化,扩展)
server端要承载很多请求,CPU和内存都是稀缺资源
stream写日志,使用redis存session
3. 日志记录
server端要记录日志、存储日志、分析日志
4. 安全
越权操作,数据库攻击
预防xss攻击和sql注入
5. 集群和服务拆分
通过扩展机器和服务拆分承载大流量

二、Node实现后端开发思路

使用node实现一个后台博客系统,简单的技术方案如下:

  • 数据如何存储
  • 如何与前端对接,即接口设计

三、Node.js的API介绍

1、http概述

一个http请求的整个过程:

  1. 前端:DNS解析,建立TCP连接(三次握手),发送http请求
  2. 后端:server接收到http请求,处理,并返回
  3. 前端:客户端接收到返回数据,处理数据(如渲染页面,执行js)

四、Node开发环境搭建

1、借助nodemoncorss-env

  • nodemon是一个工具,它可以在检测到目录中的文件更改时自动重新启动节点应用程序,从而帮助开发基于node.js的应用程序。
npm install --save-dev nodemon //安装
复制代码

nodemon包装应用程序,因此您可以将通常传递给应用程序的所有参数传递给应用程序:

// 配置文件
nodemon [your node app]
复制代码
  • cross-env是一个跨平台运行设置和使用环境变量的脚本
npm install --save-dev cross-env //安装

//配置文件
{
  "scripts": {
    "build": "cross-env NODE_ENV=production webpack --config build/webpack.config.js"
  }
}
复制代码

2、初始化路由

1.接口开发

  • 初始化路由:根据技术方案,设计出路由
  • 返回假数据:将路由和数据处理分离

五、登陆

1、cookie

  1. 什么是cookie
  • 存储在浏览器的一段字符串(最大5kb)
  • 跨域不共享
  • 格式如k1=k1;k2=k2;k3=k3;因此可以存储为结构化数据
  • 每次发送http亲求,会将请求域的cookie一起发给server
  • server可以修改cookie,并返回给浏览器
  • 浏览器中也可以通过JavaScript修改cookie(修改有限制)
  1. 客户端操作cookie
  • 查看cookie
  • 新增cookie (只能新增,不能修改)

cookie查看有三种方式:http请求/返回中;Application下;Console中执行document.cookie查看
cookie新增: 执行document.cookie = 'k2=200'
3. Server端操作cookie

  • 查看cookie
  • 修改cookie
  • 实现登陆验证
  1. 关于cookie的总结文字
  • 知道cookie的定义和特点;
  • 前后端如何查看和修改cookie;
  • 如何使用cookie实现登陆验证
  1. 缺点

会暴露username,很危险

2、session

为什么使用session?

  • 原因:因为直接用cookie传值,会暴漏username等信息,很危险。
  • 解决办法:cookie中存储userid,server端对应username

使用session(session是一种登陆注册的通用解决方案),即server端存储用户信息
session解决方案.png

3、redis

  1. window下安装redis

可参考安装步骤www.runoob.com/redis/redis…

redis-server.exe redis.windows.conf //window下启动redis
redis-cli.exe -h 127.0.0.1 -p 6379 //执行redis语句(set/get)
复制代码

设置键值对:set myKey abc
取出键值对:get myKey

  1. 上一步的session使用的是js变量,放在node.js的进程内存中

直接放到node.js进程中的缺陷:

  • 进程内存有限,访问量过大,内存暴增怎么办?
  • 正式线上运行时多进程,进程之间内存无法共享

进程内存模型.png
3. redis特点

  • webServer常用的缓存数据库,数据存放在内存中
  • 相比mysql,访问速度快(内存和硬盘不是一个级别的)
  • 成本高,可存储的数据量小
  1. redis和MySQL

4、nginx

  1. window下安装nginx

可参考安装步骤nginx.org/en/download…
nginx目录.png
2. 修改conf/nginx.conf配置文件,设置代理指向

server {
  #*********nginx监听的端口在这里设置**********
        listen       8088; 
        server_name  localhost;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

 # *********这里是修改代理指向***********
        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}
        location / {
        proxy_pass http://localhost:8001;
        }
        location /api/ {
        proxy_pass http://localhost:8000;
        proxy_set_header Host $host;
        }
}
复制代码
  1. nginx 操作命令

window系统通过dos窗口,进入根目录,执行命令

D:\soft\nginx>cd nginx-1.16.0
D:\soft\nginx\nginx-1.16.0>
复制代码
  • 测试配置文件格式是否正确:nginx -t
  • 启动:nginx
  • 重启:nginx -s reload
  • 停止:nginx -s stop
  1. nginx启动报错,查看端口是否被占用
  • tasklist

查看所有任务

  • 查看某个端口是否被监听的情况
D:\soft\nginx\nginx-1.16.0>netstat -ano |findstr 8080
  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       15448 //被进程15448占用
  TCP    10.200.22.57:55155     101.89.15.106:8080     ESTABLISHED     2088
  TCP    10.200.22.57:55228     59.37.96.203:8080      ESTABLISHED     5812
复制代码
  • 查看某个进程占用的具体程序是什么
D:\soft\nginx\nginx-1.16.0>tasklist |findstr 15448
node.exe                     15448 Console                    2     30,252 K
复制代码

六、日志

日志分类:

  • 第一:访问日志“`access log“(server端最重要的日志)
  • 第二:自定义日志(包括自定义事件、错误记录)

1. 操作文件时,node相关api

  • fs.readFile //读取文件
fs.readFile(fileName, (err, data) => {
    if (err) {
        console.error(err)
        return
    }
    // data 是二进制类型,需要转换为字符串
    console.log(data.toString())
})
复制代码
  • fs.writeFile //写入文件
const content = '这是新写入的内容\n'
const opt = {
    flag: 'a'  // 追加写入。覆盖用 'w'
}
fs.writeFile(fileName, content, opt, (err) => {
    if (err) {
        console.error(err)
    }
})
复制代码
  • fs.exists // 判断文件是否存在
fs.exists(fileName, (exist) => {
    console.log('exist', exist)
})
复制代码

以上node操作文件的api,都是一次性读完、写完,如果文件过大,会很影响效率。

2. IO操作的性能瓶颈

IO包括“网络IO”和“文件IO”。相比于CPU计算和内存读写,IO的突出特点就是:慢。

3. stream

node已经完成了对stream功能的api实现:req具有pipe(),以流的形式,更合理的读文件、写文件。
以下是利用stream,合理的进行IO操作:

const http = require('http')
const fs = require('fs')
const path = require('path')
const fileName1 = path.resolve(__dirname, 'data.txt')
const server = http.createServer((req, res) => {
    if (req.method === 'GET') {
        const readStream = fs.createReadStream(fileName1)
        readStream.pipe(res)
    }
})
复制代码

4. readline

readline 模块提供了一个接口,用于一次一行地读取可读流(例如 process.stdin)中的数据。

总结:

  • 日志对server的重要性
  • IO性能瓶颈,使用stream提高性能
  • 使用crontab拆分日志文件,使用readline分析日志内容

七、项目安全

  • sql注入: 窃取数内容
  • XSS攻击:窃取前端的cookie内容
  • 密码加密:保障用户信息

1. sql注入

sql是最原始、最简单的攻击,从有了web2.0就有了sql注入攻击。

攻击方式:输入一个sql片段,最终拼接成一段攻击代码

预防措施:使用mysql的escape函数处理输入内容即可。

执行sql注入攻击的效果:

const sql = `
        select username, realname from users where 
        username=${username} and password=${password}
    `
复制代码

图片[4]-使用Node开发后端项目-一一网
攻击者可以任意操作数据库。

2. XSS攻击

攻击方式:在页面展示内容中参杂js代码,以获取网页信息

预防措施:转换生成JS的特殊字符

使用XSS处理输入的内容

npm install xss --save
复制代码

On Node.js

var xss = require("xss");
var html = xss('<script>alert("xss");</script>');
console.log(html);
复制代码

3. 密码加密

数据库被用户攻破,最不应该泄密的就是用户信息。

攻击方式:用户用户名和密码,在去尝试登陆其他系统

预防措施:将密码加密,即便拿到密码,也不知道明文密码

使用md5加密,如下:

const crypto = require('crypto')
// 密匙
const SECRET_KEY = 'WJiol_8776#'
// md5 加密
function md5(content) {
    let md5 = crypto.createHash('md5')
    return md5.update(content).digest('hex')
}
// 加密函数
function genPassword(password) {
    const str = `password=${password}&key=${SECRET_KEY}`
    return md5(str)
}
复制代码

4. 项目总结

  • 处理http接口 //rquest,cookie,处理路由等
  • 连接数据库
  • 实现登录 //session,redis,
  • 安全
  • 日志 //stram,readline

项目总流程图如下:

八、express

1、安装

  1. express脚手架安装

链接:expressjs.com/en/starter/…
npm install -g express-generator
2. 实现登陆需要两个包

  • express-session安装

链接:github.com/expressjs/s…
npm install express-session

  • connect-redis安装

链接:github.com/tj/connect-…
npm install connect-redis express-session

2、express的中间件概念

//登陆校验的中间件
function loginCheck(req, res, next){
  setTimeout(()=> {
    res.json({
      errno: -1,
      msg: '登陆失败'
    })
   // next()
  })
}

//路由匹配
router.get('/', loginCheck, function(req, res, next) {
  res.send('respond with a resource');
});
复制代码

3、总结

  • 初始化代码中,各个插件的作用
  • express如何处理路由
  • express中间件

九、koa2

1. 为什么使用koa2

express 中间件是异步回调,koa2原生支持async/await

新开发的框架和系统,都是基于koa2,例如egg.js
express虽为过时,但是koa2是未来趋势

2. async/await 要点:

1.await 后面可以追加promise对象,获取resolve的值
2.await必须包裹在async函数里面
3.async函数执行返回的也是一个promise对象
4.try-catch获取promisereject的值

//简单的异步函数demo
async function readFileData(){
   try{
    const aData = await getFileContent('a1.json')
    const bData = await getFileContent(aData.next)
    const cData = await getFileContent(bData.next)
   }catch (err){
       console.error(err)
   }
}
readFileData();
复制代码

3. koa脚手架安装【koa1和koa2通用】

$ npm install -g koa-generator
复制代码

基于脚手架创建koa1项目:

$ koa2 /tmp/foo && cd /tmp/foo
$ npm install
$ npm start
复制代码

基于脚手架创建koa2项目:

$ koa2 /tmp/foo && cd /tmp/foo
$ npm install
$ npm start
复制代码

4. 实现登陆需要两个包

$ npm install koa-redis koa-generic-session redis --save
复制代码

5. 路由

(1)xss 安装: 预防xss攻击

npm install xss --save
复制代码

(2)MySQL安装

npm install mysql --save
复制代码

(3)morgan和koa-morgan: 打印日志
express支持morgan,不支持koa。koa需要安装中间件,koa-morgan

npm install --save koa-morgan
复制代码

6. koa2中间件原理

十、上线与配置

  • 服务器稳定性
  • 充分利用服务器硬件资源
  • 线上日志记录

1. PM2

简单介绍:

  • 进程守护,系统崩溃自动重启
  • 启动多进程,充分利用CPU和内存
  • 自带日志记录功能

(1)下载

npm install pm2 -g
复制代码

(2)常用命令

pm2 start //启动
pm2 list //查看启动后的所有信息状态
pm2 restart [App name]/[id] // 重启
pm2 stop [App name]/[id] //停止
pm2 delete [App name]/[id] //删除
pm2 info [App name]/[id] //基础信息
pm2 log [App name]/[id] //查看log信息
pm2 monit [App name]/[id] //查看cpu、内存等信息
复制代码

图片[5]-使用Node开发后端项目-一一网
(3)进程守护

  • node app.jsnodemon app.js,进程崩溃则不能访问
  • pm2遇到进程崩溃,会自动重启

(4)PM2配置
pm2的配置文件:

{
    "apps": {
        "name": "pm2-test-server",
        "script": "app.js",
        "watch": true,
        "ignore_watch": [
            "node_modules",
            "logs"
        ],
        "instances": 4, 
        "error_file": "logs/err.log",
        "out_file": "logs/out.log",
        "log_date_format": "YYYY-MM-DD HH:mm:ss"
    }
}
复制代码

(5)多进程

使用多进程的理由:

  • 为什么用多进程
  • redis

使用多进程带来的问题:多进程之间,内存无法共享
解决方案:多进程访问一个redis,实现数据共享

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享