使用Node开发后端项目 您所在的位置:网站首页 后端开发视频教程下载安装 使用Node开发后端项目

使用Node开发后端项目

2023-08-04 12:49| 来源: 网络整理| 查看: 265

一、Node简单介绍 1、Node用途

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

运行在服务器,作为web server 运行在本地,作为打包、构建工具 2、下载和安装 普通下载 按照node官网下载即可。 NVM下载

NVM是node的版本管理工具,可切换多个node版本。

window使用

github搜索 nvm-windows,按照步骤下载即可。

mac使用 打开你的Shell配置文件。如果你正在使用zsh,请打开 ~/.zshrc 文件。如果你正在使用bash,请打开 ~/.bashrc 文件。 在文件中添加以下代码: export NVM_DIR="$HOME/.nvm" [ -s "$(brew --prefix nvm)/nvm.sh" ] && . "$(brew --prefix nvm)/nvm.sh" # This loads nvm 保存并关闭文件。然后,在终端中输入以下命令,使更改生效: source ~/.zshrc # 如果你使用的是zsh source ~/.bashrc # 如果你使用的是bash 命令介绍

使用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的区别 JavaScirpt 包括ECMAScript语法规范和Web API。 两种结合,才能实现页面的各种操作。 Javascript组成.png Node.js 包括ECMAScript语法规范和Node.js API。 两种结合,才能完成server端的任何操作。 Node组成.png 4、Common.js 和debugger 5、 server端和前端的区别

server端的考虑点:

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

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

数据如何存储 如何与前端对接,即接口设计 三、Node.js的API介绍 1、http概述

一个http请求的整个过程:

前端:DNS解析,建立TCP连接(三次握手),发送http请求 后端:server接收到http请求,处理,并返回 前端:客户端接收到返回数据,处理数据(如渲染页面,执行js) 四、Node开发环境搭建 1、借助nodemon、corss-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 什么是cookie 存储在浏览器的一段字符串(最大5kb) 跨域不共享 格式如k1=k1;k2=k2;k3=k3;因此可以存储为结构化数据 每次发送http亲求,会将请求域的cookie一起发给server server可以修改cookie,并返回给浏览器 浏览器中也可以通过JavaScript修改cookie(修改有限制) 客户端操作cookie 查看cookie 新增cookie (只能新增,不能修改)

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

查看cookie 修改cookie 实现登陆验证 关于cookie的总结文字 知道cookie的定义和特点; 前后端如何查看和修改cookie; 如何使用cookie实现登陆验证 缺点 会暴露username,很危险 2、session

为什么使用session?

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

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

3、redis 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

上一步的session使用的是js变量,放在node.js的进程内存中 直接放到node.js进程中的缺陷: 进程内存有限,访问量过大,内存暴增怎么办? 正式线上运行时多进程,进程之间内存无法共享

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

webServer常用的缓存数据库,数据存放在内存中 相比mysql,访问速度快(内存和硬盘不是一个级别的) 成本高,可存储的数据量小 redis和MySQL 4、nginx window下安装nginx 可参考安装步骤nginx.org/en/download… nginx目录.png 修改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; } } 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 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} `

攻击者可以任意操作数据库。

2. XSS攻击

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

预防措施:转换生成JS的特殊字符 使用XSS处理输入的内容

npm install xss --save

On Node.js

var xss = require("xss"); var html = xss('alert("xss");'); 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、安装 express脚手架安装 链接:expressjs.com/en/starter/… npm install -g express-generator 实现登陆需要两个包 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获取promise中reject的值

//简单的异步函数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、内存等信息

(3)进程守护

node app.js 和nodemon 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,实现数据共享



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有