什么是node
- chrome V8 runtime
- 事件驱动
- 非阻塞i/o
优点:高并发特别好(在python出来之前并发问题node是处理最好的,python强于node)
i/o:input output 输入输出流 正常情况下i/o的操作都是阻塞的,相当于同步的ajax
为什么要学node
- 防止甩锅
前端在前后端交互中,可以明确到底是前端储问题还是后台出问题,省的后台爸爸甩锅到前台 - 能够书写API
- 了解前后端交互流程
- 全栈工程师
js运行环境
- 浏览器
- 基本语法
- bom
- dom
- ajax
- 系统文件,服务器文件(不能,不是语言不能,只是出于安全性考虑)
- 服务器
- 基本语法
- 操作数据库
- 操作本地文件
结论:限制语言能力的不是语言本身,而是语言的运行环境
nvm
在需要的时候想起来就行
node的版本管理工具,可以实现node版本的切换
nvm ls 查看
nvm use v10.8.0 使用版本
npm
- 临时使用
npm install express --registry http://registry.npm.taobao.org - 全局使用
npm config set registry https://registry.npm.taobao.org
//配置后通过以下方式验证是否成功
npm config get registry / npm info express - 安装cnpm
npm install -g cnpm --registry=http://registry.npm.taobao.org
个人更加建议使用2,2使用但是不用安装cnpm
node的语言环境
REPL – 打开命令行,输node直接在命令行写代码
模块化
- 内置模块
- 第三方模块
- 自定义模块
自定义模块
- 创建一个模块(一个js就是一个模块)
- 导出一个模块
- 引入一个模块并调用
let name = {
sayHello(){
console.log("hello world")
}
}
module.exports = name;
let module = require("./moduile")
moduile.sayHello()
内置模块
文件操作(fs)
const fs = require(‘fs’)
实现文件夹的增删改查
注意:异步不会发生阻塞,同步会发生阻塞,造成系统崩毁。处理错误仓用方法是try…catch
- 查
- 同步实现
fs.readdirSync(path [,mode])
- 异步实现
fs.readdir(path [,mode],callback)
2.增(创建一个文件夹) 已经存在的文件夹不可以被创建 - 同步实现
fs.mkdirSync(path [,mode])
- 异步实现
fs.mkdir(path [,mode] , callback)
3.更改 - 同步实现
fs.renameSync(oldPath,newPath) - 异步实现
fs.rename(oldPath,newPath,callback)
4.删除
注意:只能删除空文件夹
- 同步实现
fs.rmdirSync(path) - 异步实现
fs.rmdir(path,callback)
实现文件内容的增删改查
这里只写异步写法,同步同上
- 创建文件(覆盖写入)
fs.writeFile(path,content,callback)
- 写入文件
fs.appendFile(path,content,callback)
- 读取文件
fs.readFile(path,[‘utf8’],callback)
但是控制台上输出的并不是我们所想要的内容,而是Buffer二进制数据流
此时我们有两种方法
- 在参数中加入’utf8’
- data.toString(‘utf8’)
-
删除文件
fs,unlink(’./name.txt’,(err) => {
) -
判断是文件还是文件夹
class --> fs.stats
fs.stat('./node01',(err,stats) => {
if(stats.isFile()){
//是文件夹
}else{
//不是文件夹
}
})
url
url 统一资源定位器
const url = require(‘url’)
常用有两个方法:
- url.parse(string)
将url字符串转为对象 - url.format(obj)
将url对象转为字符串
querystring
const qs = require(“querystring”)
-
qs.parse()
query字符串转换为query对象
一般来说,query字符串的形式都会是"name=wang&pass=111&sex=1",但如果是"name-wang#pass-111#sex-1“”这种形式的又该如何呢??
qs.parse(string,"#","-") – 这时我们就需要parse的另外两个参数了
第一个参数:需要转换为query对象的query字符串
第二个参数:以哪个参数区分键值对
第三个参数:以哪个参数区分键和值 -
qs.stringify(obj)
将query对象转换为query字符串
qs.stringify(obj,"^","-") 同上 -
qs.unescape(string) 解码
-
qs.escape(string) 编码
express框架
首先带大家大致了解下前后端的职责
前端:写界面 请求数据 数据处理
后端: 写api接口
接下来会以登陆接口为例进行分析
登录接口逻辑分析:
- 接收用户传递数据
- 处理数据
- 返回数据
express基本使用
- 安装express
npm install express --save - 使用
只需在浏览器url中输入 http://localhost:3000/user/login
显示出来即表示成功,但是需要注意的是,对于post请求不可这样使用
服务器
在这里补充下服务器相关知识
ifconfig max查看ip
ipconfig window查看ip方法
服务器介绍
- 服务器就是一台电脑
- 服务器软件(apache tomcat iis nignx node)
- 服务器ip和端口号
局域网
服务器通过网线(无线)连接,每一台电脑都有一个IP
ip
确定服务器主机的位置
port
确定服务器里某一个程序(端口号)
api接口构成要素
ip port pathname method 接受用户传过来的数据(数据格式后端定)
接受get参数 ---- query
接受post参数 ---- body
但是此时打印出来的是undefined。这是为啥呢?
原因是express不能直接解析消息体,必须通过第三方插件解析
------body-parser 插件
body-parser 插件
在express中想要解析post传来的参数,需要通过body-parser插件
post方式传递时,参数可分为三类:
- application/x-www-form-urlencoded 表单传输
- application/json json传参
- formdata 文件传输常用格式
安装 npm install body-parser
使用
- 引入 const bodyParse =require(“body-parser”)
- 使用
app.use(bodyParse.urlendcoded({extended: false})) //解析表单数据 application/www-form-urlencoded
app.use(bodyParse.json()) //解析json
express路由
会经常用到,很实用
目录结构
service.js(首页)
user.js
中间件 middlewear
可分为三类:
- 内置中间件 static
- 自定义中间件
- 第三方中间件
自定义中间件
1. 全局使用
2. 局部使用
内置中间件
static 静态资源目录
静态资源: 指定一个目录,目录可以被访问(等同于apache的www)
(等待)