Node
介绍
1、为什么JavaScript可以在浏览器中运行
在浏览器中有js的解析器,也叫做解析引擎。不同浏览器的引擎是不同的。
IE:charka(查克拉) Safari:jscode Chrome:V8 (所有浏览器引擎中最好的一个)
2、为什么JavaScript可以操作BOM和DOM
每个浏览器都内置了DOM和BOM这样的API函数,只能在浏览器中使用。这也就是为什么各个浏览器对DOM和BOM的操作可能出现兼容问题的原因。
3、什么是nodeJS
Node.js 是一个基于 Chrome V8 Java 引擎的 JS 运行环境
nodejs可以看做是一个解析器,是一个运行时环境。可以让我们脱离浏览器来运行JavaScript代码。
浏览器中的js只能操作DOM元素。不能读写文件,不能搭建网络服务,不能操作数据库。node可以!!!。
4、JavaScript与NodeJS的区别
JavaScript | NodeJS |
---|---|
客户端技术,运行在浏览器 | 服务器端技术,与Java,PHP,C++等是后端语言 |
有多种解析器可以使用 | 只能运行于Chrome的V8引擎下。 |
因为支持多种解析器,所以存在兼容问题 | 只有一个解析器,不存在兼容问题 |
ES语法,浏览器API(BOM,DOM) | ES语法,node内置API(模块),第三方API(模块) |
主要用于网页DOM操作,实现用户交互效果 | 主要用于实现服务器端的运行逻辑,如访问数据库,文件读写等 |
文件 路径 操作
路径操作
路径操作 | 解释 |
---|---|
__dirname | 返回当前位置的父级路径 |
__filename | 返回当前文件的绝对路径 |
文件模块 fs
读、写、重命名、mkdir、删除
1、fs.readFile (路径、编码、回调函数)
//读取文件的方法,第一个参数为 读取文件的路径 第二个参数为 文件的编码 第三个参数为回调函数,表示读取成功后,执行这个函数,函数有两个参数,第一个为错误信息,第二个为读取到的内容 fs.readFile("hell.txt","utf-8",function(err,data){ if (err) { //如果err有信息,则说明读取失败,将失败信息打印,并返回。 如果没有错误,err的值为null console.log(err); return; } //data就是读取到的内容 console.log(data); })
2、fs.writerFile(路径、文本、回调函数)
// 写入文件 第一个参数为路径,第二个参数为 写入的内容 第三个参数为回调函数 fs.writeFile("hell.txt","hello,world",function(err){ //回调函数,会在写入后执行。 console.log(err); })
3、fs.unlink(文件路径、回调函数) -- 删除
fs.unlink("hell.txt",function(err){ if (err) { console.log(err); } })
4、fs.mkdir(目录、回调函数}) -- 创建文件夹
fs.mkdir("img",function(err){ if (err) { console.log(err); } });
5、fs.rename(旧名字、新名字、回调函数) -- 重命名文件
fs.rename("hello.txt","你好.txt",function(err){ if (err) { console.log(err); } })
路径模块 path
不同操作系统的路径分隔符是不同的。 window下是\ linux是/
1、path.jion( )
const {join} = require('path')
console.log(join('/user','aaa','../'))
// 输出 \user\
console.log(join('/user','aaa','../', 'bbb'))
// 输出 \user\bbb
用于连接路径。会正确使用当前系统下的分隔符
2、path.extname (path)
返回路径中的文件的后缀名
3、path.basename(path,[ext])
返回文件的文件名+后缀,如果指定了第二个参数,则表示 将该后缀删除
4、path.resolve()
将路径或路径片段的序列解析为绝对路径。
5、path.parse()
const {parse, format} = require('path')
const url = '/user/data/aaa/b.js'
const ret = parse(url)
console.log(ret)
//{ root: '/',
// dir: '/user/data/aaa',
// base: 'b.js',
// ext: '.js',
// name: 'b' }
console.log(format(ret))
// /user/data/aaa\b.js
返回一个对象,其属性表示 path 的重要元素。 尾部的目录分隔符将被忽略
path.format() 与 path.parse() 行为相反;
HTTP模块
输出:res.end() res.write() 两者的区别
res.write() 相当于编辑状态:还未向页面输出 res.end() 相当于确定输出响应状态 如果只有res.write()浏览器会一直处于请求状态; res.end()后边不能再有输出,且只能输出字符串
搭建服务器
//导入模块 const http = require("http"); const fs = require("fs"); const path = require("path"); //搭建服务器 req请求-request res相应 http.createServer(function(req,res){ //req.url保存的是 网络资源路径 if(req.url == "/"){ //读取主页面 readFile(路径,编码方式,回调(err data)函数 fs.readFile(path.join(__dirname,"index.html"),"utf-8",(err,data)=>{ if(err){ console.log("服务器出错"); //响应错误 res.setHeader("Content-Type","text/html,charset=utf-8")//设置字符集 res.end(JSON.stringify(err)); return; } //响应页面 res.end(data); }) } else if (req.url == '/favicon.ico') { //获取图标 fs.readFile(path.join(__dirname,"favicon.ico"), function(err, data) { if (err) { res.end(JSON.stringify(err)); return; } res.end(data); }) }else{ //获取其他页面 fs.readFile(path.join(__dirname,req.url), function(err, data) { if (err) { res.end(JSON.stringify(err)); return; } res.end(data); }) } }).listen(3000) //监听端口 //开启服务器的提示 console.log("服务器开启成功");
获取请求的参数
1、请求方式
常见的请求方式有两种:post get
post和get的区别:
post:
1、post的语义是 推送,邮寄, 使用场景为 向服务器推送用户信息。比如,注册,登录。 2、安全的,参数不会出现在地址栏 3、传输的大小不会被浏览器限制,理论上可以相传多大的文件就传多大的文件。但是一般服务器会显示你们的上传大小。
get:
1、get的语义是 获取, 使用场景为 获取服务器上的数据。比如,访问某一个页面,获取列表信息等。 2、不安全。 3、上传大小最多只有4KB。
表单提交: <form action="提交的地址" method="post/get……"> <!-- input的name属性必须定义,只有有name属性的input,它的值才会被form提交到服务器 --> 用户名:<input type="text" name="username"><br> 密 码:<input type="password" name="pwd"><br> <input type="submit" value="登录"> </form>
http请求的八种方式:
一、GET方法:最常用的方法,它是发送一个请求来获取服务器上的资源,资源通过HTTP响应头和数据(如html文档,图片,样式,视频等)返回给客户端(如浏览器)。 二、POST方法:常用方法,用于向服务器提交数据,请求的参数要在请求体(body)中发送,可用于表单的提交和异步提交(如ajax),理论上,POST传递的数据量没有限制。 三、PUT方法:与POST方法类似,在RESTful设计规范中,一般POST方法代表新增,PUT方法代表整体更新,选择什么方法主要看接口的要求,PUT请求的参数一样要在HTTP请求的消息主体中发送,默认情况下put请求是无法提交表单数据的。 四、PATCH方法:与PUT方法类似,但PATCH方法通常应用于局部更新。 五、DELETE方法:删除某一个资源,默认情况下DELETE方法在 URL 中附带查询参数,也无法提交表单数据的。 六、OPTIONS方法:获取服务器支持的HTTP请求方法,服务器性能、跨域检查等。 七、CONNECT方法:方法的作用是把服务器作为跳板,让服务器代替用户去访问其他网页,只有把数据原原本本返回给用户,网页开发基本不用这个方法。如果是http代理就会使用这个,让服务器代理用户访问其他网页,类似于中介。 八、TRACE方法:回服务器收到的请求,主要用于测试或诊断。
2、常见状态码
200:成功 2开头的都表示成功
404:请求的资源不存在。 4开头的都表示客户端错误。
302:重定向。 类似于生活的呼叫转移。
304:缓存
500:服务器端错误。
3、获取参数
引入 const { URLSearchParams } = require("url")
URLSearchParams 可以对 get请求过来的参数进行解析,将查询字符串转为一个对象。通过该集合的get方法来获取相应的值。
//将查询字符串解析为对象,方便获取其中的数据 let params = new URLSearchParams(req.url.substring(2)); //获取输入的用户名 let username = params.get("username") //获取输入的密码 let pwd = params.get("pwd"); ……
get参数:是以数据流的形式不断地传输 因此需要:一个变量用来接收数据、两个事件用来监听
//当有数据传输过来时,会自动触发。 req.on("data",trunk=>{ body += chunk; //trunk 每次传输的数据 body 数据字符串 }) +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //当所有的数据都传输完了时,会自动触发。 req.on("end",()=>{ 这是body保存的是所有传入数据…… })
//定义一个变量 body,用来处理存储用户传输的数据。 let body = ""; //监听 data事件,当有数据传输过来时,会自动触发。 req.on("data", chunk => { body += chunk; }) //监听 end 事件,当所有的数据都传输完了时,会自动触发。 req.on("end", () => { // 将查询字符串解析为对象,方便获取其中的数据 let params = new URLSearchParams(body); //获取输入的用户名 let username = params.get("username") //获取输入的密码 let pwd = params.get("pwd"); …… })
MIME类型
1)文本类型 text/plain text/html text/css text/javascript text/json ... 2)图片类型 image/gif, image/png, image/jpeg, image/bmp, image/webp 3)音频类型 audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav 4)视频类型 video/webm, video/ogg 5)二进制数据 application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf 6)细分领域的文件类型(常用) multipart/form-data multipart/byteranges
特别注意:
![](https://img-blog.csdnimg.cn/d95d271994cf47d6adc4e4bbd5d6477f.png)