一、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 文件。
- 在文件中添加以下代码:
1 | bash复制代码export NVM_DIR="$HOME/.nvm" |
- 保存并关闭文件。然后,在终端中输入以下命令,使更改生效:
1 | bash复制代码source ~/.zshrc # 如果你使用的是zsh |
命令介绍
使用NVM之前,需将之前已经独立安装的node版本卸载。后续都通过NMM管理node版本。
1 | rust复制代码nvm list //查看已存在的node版本 |
3、Node.js和JavaScript的区别
- JavaScirpt
包括ECMAScript语法规范和Web API。
两种结合,才能实现页面的各种操作。 - Node.js
包括ECMAScript语法规范和Node.js API。
两种结合,才能完成server端的任何操作。
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的应用程序。
1 | scss复制代码npm install --save-dev nodemon //安装 |
nodemon包装应用程序,因此您可以将通常传递给应用程序的所有参数传递给应用程序:
1 | less复制代码// 配置文件 |
cross-env
是一个跨平台运行设置和使用环境变量的脚本
1 | json复制代码npm install --save-dev cross-env //安装 |
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端存储用户信息
3、redis
- window下安装redis
可参考安装步骤www.runoob.com/redis/redis…
1 | bash复制代码redis-server.exe redis.windows.conf //window下启动redis |
设置键值对:
set myKey abc
取出键值对:get myKey
- 上一步的
session
使用的是js变量,放在node.js的进程内存中
直接放到node.js进程中的缺陷:
- 进程内存有限,访问量过大,内存暴增怎么办?
- 正式线上运行时多进程,进程之间内存无法共享
3. redis特点
- webServer常用的缓存数据库,数据存放在内存中
- 相比mysql,访问速度快(内存和硬盘不是一个级别的)
- 成本高,可存储的数据量小
- redis和MySQL
4、nginx
- window下安装nginx
可参考安装步骤nginx.org/en/download… - 修改
conf/nginx.conf
配置文件,设置代理指向
1 | ini复制代码server { |
- nginx 操作命令
window系统通过dos窗口,进入根目录,执行命令
1 | makefile复制代码D:\soft\nginx>cd nginx-1.16.0 |
- 测试配置文件格式是否正确:
nginx -t
- 启动:
nginx
- 重启:
nginx -s reload
- 停止:
nginx -s stop
- nginx启动报错,查看端口是否被占用
- tasklist
查看所有任务 - 查看某个端口是否被监听的情况
1 | yaml复制代码D:\soft\nginx\nginx-1.16.0>netstat -ano |findstr 8080 |
- 查看某个进程占用的具体程序是什么
1 | arduino复制代码D:\soft\nginx\nginx-1.16.0>tasklist |findstr 15448 |
六、日志
日志分类:
- 第一:访问日志
log``(server端最重要的日志) 1
2
3
4
5
6
7* 第二:自定义日志(包括自定义事件、错误记录)
#### 1. 操作文件时,node相关api
* fs.readFile //读取文件
javascript复制代码fs.readFile(fileName, (err, data) => {
if (err) {
console.error(err)
return
}
// data 是二进制类型,需要转换为字符串
console.log(data.toString())
})
1 |
|
javascript复制代码const content = ‘这是新写入的内容\n’
const opt = {
flag: ‘a’ // 追加写入。覆盖用 ‘w’
}
fs.writeFile(fileName, content, opt, (err) => {
if (err) {
console.error(err)
}
})
1 |
|
javascript复制代码fs.exists(fileName, (exist) => {
console.log(‘exist’, exist)
})
1 |
|
ini复制代码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)
}
})
1 |
|
ini复制代码const sql = select username, realname from users where
username=${username} and password=${password}
1 |
|
css复制代码npm install xss –save
1 |
|
ini复制代码var xss = require(“xss”);
var html = xss(‘‘);
console.log(html);
1 |
|
javascript复制代码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)
}
1 |
|
javascript复制代码//登陆校验的中间件
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’);
});
1 |
|
javascript复制代码//简单的异步函数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();
1 |
|
ruby复制代码$ npm install -g koa-generator
1 |
|
shell复制代码$ koa2 /tmp/foo && cd /tmp/foo
$ npm install
$ npm start
1 |
|
shell复制代码$ koa2 /tmp/foo && cd /tmp/foo
$ npm install
$ npm start
1 |
|
css复制代码$ npm install koa-redis koa-generic-session redis –save
1 |
|
css复制代码npm install xss –save
1 |
|
css复制代码npm install mysql –save
1 |
|
css复制代码npm install –save koa-morgan
1 |
|
复制代码npm install pm2 -g
1 |
|
less复制代码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、内存等信息
1 |
|
json复制代码{
“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,实现数据共享

**本文转载自:** [掘金](https://juejin.cn/post/6959583458779725860)
*[开发者博客 – 和开发相关的 这里全都有](https://dev.newban.cn/)*