使用Node开发后端项目

使用Node开发后端项目Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 按照node官网下载即可。 NVM,node的版本管理工具,可切换多个node版本。 github搜索 nvm-windows,按照步骤下载即可。 使用NVM之前,需将之前已经独立安装的n…

一、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}
    `

使用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

项目总流程图如下: 使用Node开发后端项目

八、express

1、安装

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

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、内存等信息

使用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,实现数据共享

使用Node开发后端项目

今天的文章使用Node开发后端项目分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22277.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注