nodejs:0到1的冲刺,毕业小白到公司大佬的逆袭之路,到底学了哪些?_nodejs学到什么程度可以工作

28 阅读15分钟

img img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

console.log(path.resolve("a", "b", "c")); console.log(path.resolve("a", "../b", "c")); console.log(path.resolve("/a", "b", "c"));




> 

> \_\_dirname:是nodejs提供的一个内置变量,代表当前文件所在位置的绝对路径

> 

> 

> 斜杠和反斜杠:通常用来分割路径,"某个文件夹下"的意思,在windows系统中,斜杠和反斜杠的意义是一样的,但是建议大家写斜杠,反斜杠用在代码中,有特殊含义,转义的意思,在服务器系统中,默认路径就使用斜杠

> 

> 

> 



  



---


  


#### url


url的完整形态:


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e3b9a61b4a3b41b6a956bc136165941e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=CtofKFHIsPBL6DGYtGvO%2FNT%2BX64%3D)


URL字符串是结构化的字符串,包含多个含义不同的组成部分。 解析字符串后返回的 URL 对象,每个属性对应字符串的各个组成部分。


url模块 用来处理url  
 一个url :http://localhost:80/project/src/userinfo.html  
 完整形态的url:协议 + 用户名密码 + 主机名 + 端口号 + 请求路径 + 参数 + hash值(锚点)


协议默认会跟端口号相对应:  
 http - 80  
 https - 443  
 ftp - 21  
 sftp - 22  
 mysql - 3306  
 …




> 

> 请求路径后的参数,参数和请求路径之间由 ? 隔开的  

>  参数由键值对组成,键和值之间使用 = 隔开  

>  键值对之间使用 & 隔开

> 

> 

> 



导入url 模块



const url = require('url')


解析网址,返回Url对象  
 参2 如果为truequery获取得到的为对象形式



const url = require('url'); const href = 'www.xxx.com:8080/pathname?id…' // url.parse(href,true)

以一种 Web 浏览器解析超链接的方式把一个目标 URL 解析成相对于一个基础 URL。 url.resolve('lynnn.cn/foo/bar',..…') // lynnn.cn/bar


例:



const url = require('url') let href = "http://xiaoming:123456@localhost:80/project/src/userinfo.html?id=5&cat=8#top"; let obj = url.parse(href) obj.query是我们比较常用的,因为我们经常会解析路径中的数据 console.log(obj);


![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FieRAdVk-1624796714651)(media/1624344004493.png)]](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9a76ca2712c14092a211de01bf84ac09~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=f%2BV2MCFkjxqqcTaGfpcyibwyA3k%3D)


resolve方法也是路径的拼接  
 根据url的规则进行路径的拼接



let u = url.resolve('lynnn.cn/foo/bar', '../bar') console.log(u); // lynnn.cn/bar


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d849164c4e4e4fc0ba6b94f8ffa0ca70~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=xPtXq7fiWY8s0oZM2Jn6RncrXD8%3D)



let u = url.resolve('lynnn.cn/foo/bar','a…') // lynnn.cn/foo/ aa console.log(u) // lynnn.cn/foo/aa


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/3ba8fdb5d1ff487bbf2615a26f4aed7f~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=meeI96mx4k80wjvuTV%2FifRBAXhM%3D)



let u = url.resolve('lynnn.cn/foo/bar', '../bar') 'lynnn.cn/bar' console.log(u); // lynnn.cn/bar


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/173157a0211846ad83f0f384e6941d47~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=u0Scb2aPoxy5Fg3AvbS75h%2FIpr8%3D)


#### querystring


querystring模块主要用来处理url中的参数  
 用于**解析和格式化** URL 查询字符串(URL地址的get形式传参)的实用工具。



const querystring = require('querystring')

  1. query字符串转为对象 querystring.parse('foo=bar&abc=xyz') querystring.decode('foo=bar&abc=xyz')

  2. 对象转为query字符串 querystring.stringify({ foo: 'bar',abc: 'xyz'}) querystring.encode({ foo: 'bar',abc: 'xyz'})


例:



const querystring = require('querystring') let href = "http://localhost/a/b/c.html?id=6&cat=8"; const url = require('url')


将href中的参数解析出来



let query = url.parse(href).query console.log(query);


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6104d15f79fb48d5a696a277808fd958~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=hazMVjhUtv3PrmQxH%2BwSIUehuv8%3D)  
 将url中参数部分转换成一个对象



let obj = querystring.parse(query) console.log(obj);


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/27b64b10b07143788aed9853e100ade3~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=wQo5ZDbbyEXZLzO6rlKSdfrKcdk%3D)  
 可以将对象转成url的参数形式 - querystring paramters



let str = querystring.stringify(obj) console.log(str);


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/dd9b2afb95c243fa87af91e48235362b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=yjaiCOsdWtiu0ZSpQbhQqBVINw4%3D)


还有另外两个方法跟这两个方法的功能是一样的



let obj = querystring.decode(query) // 将字符串转为对象 console.log(obj);

// encode - 将对象转为字符串 let str = querystring.encode(obj) console.log(str);


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e274a494fb2f4ac2ab8324610f5722d6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=Zja%2BunB42vWHUV%2BbaoogJX4u3u0%3D)


  



---


  


#### fs


fs(file system)模块提供了用于与文件进行交互相关方法。  
 导入fs模块:



const fs = require('fs')


新建一个txt文件:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c75e0284de754c5ebb01d74d45e7e19e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=Zso4%2Bd6YtqvVNIO6oxs17gbqKB0%3D)  
 异步读取:



fs.readFile('test.txt', (err, data) => { if (err) { console.log("读取失败,错误:" + err); return; } console.log(data); // 默认读取出来的是buffer数据 console.log(data.toString()); })


实现: 分别是buffer和字符串  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/1aa504258e114fdca9554869f3a6f184~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=EmFI9Ro%2Fcm%2F2mp2qAu9vhuOBWE8%3D)  
 同步读取:



let data = fs.readFileSync('test.txt') console.log(data.toString()); console.log(123);


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/da62263f57fa402c852d5427d078d923~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=hpm4iKPaieV%2FRB6aRcW%2F4Nn8TVE%3D)  
 异步写入:



fs.writeFile('test.txt','abcdef',err=>{ if(err){ console.log("写入失败,错误:"+err); return } console.log("写入成功"); })


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/91ef5e309c29467b95d1009f0e844fc6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=%2B8837cZAduRrEgREF8345jI7ytI%3D)  
 查看txt 文件:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/80c9fe15c200458f80cfc23f31c84621~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=IIrbiBF%2BiPobSFVpX11D4gNO8IE%3D)  
 同步写入:



fs.writeFileSync('test.txt','asdfasdf') console.log("写入成功"); console.log(123);


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fe456447a9a14debb79bad69c2192a6c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=nLnC20BD0vzoELbmHc%2Bbr969hAQ%3D)  
 查看txt文件:


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/858fdba427ce47c8a3832dba787afef6~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=cAIi8PK%2Fax82WmMj%2B7KDGYHk60c%3D)  
 上面的写入方式是覆盖写入,如果要追加而不覆盖 - appendFile



fs.appendFile('./test.txt','123456',err=>{ if(err){ console.log("追加失败,错误是:"+err); return } console.log("追加成功"); }) console.log(123);


效果:


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2feb1d8437d14853807fade085cef7ad~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=PW76gSgOAL4hmyBFrqYbkChw6LM%3D)  
 查看txt:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/0b3f7014f77445019b62db5347a0108d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=EYA5Wt1QdGZA%2B7rVizUqSQijSgM%3D)  
 同步追加



fs.appendFileSync('test.txt','abcdef') onsole.log("追加成功"); console.log(123);


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/2b9c386f500e4c54b78f7b1faeebdb5a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=NBSHtb5HVt3QwnYHfijY%2FZ8%2F2yI%3D)  
 查看txt:


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/186e0ace4a1844bcbed6f37faa035fab~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=5TW4Etc4340sPbJhCss2w7Xi5Jk%3D)  
 判断文件是否存在的 - 返回布尔值



let bool = fs.existsSync('c.js') console.log(bool);


效果:  
 ![](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/13bc053b3a7a4a2d94809502b741e4c3~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=hrkwWgsN2%2Fm%2BOG3oz9RMX0gh2dE%3D)



fs.stat('test.txt', (err, info) => { // err如果存在,就说明获取文件信息失败 if (err) { console.log("获取失败,错误是:" + err); return } console.log(info); // info就是获取到的文件信息 console.log(info.isDirectory()); // 判断这是否是一个目录 - 返回布尔值 console.log(info.isFile()); // 判断这是否是一个文件 - 返回布尔值 console.log(info.size); // 文件大小 - 字节数 })


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d299713e57864b42aeedc91020b8e167~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=Rkqw0NDdDRcCdmLk7Zs1I5zbmDo%3D)  
 文件删除



fs.unlink('test.txt',err=>{ if(err){ console.log("删除失败"); return } console.log("删除成功"); })


流形式读取:



const fs = require('fs') // 以流形式读取 // 创建一个读取的文件流 let stream = fs.createReadStream('./test.txt') // console.log(stream); // 绑定data事件开始接收一点一点的数据流 let data = ''; // 这是异步操作 stream.on('data', chunk => { // chunk是数据流 - 从文件流中一点一点流出来的数据 // chunk其实是一个buffer console.log(chunk); data += chunk; // 用字符串跟buffer进行拼接,将buffer转成字符串 }) // 再次绑定一个end事件,表明文件流中的所有数据都流出去了 stream.on('end', () => { console.log(data, 1111111); })


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c495522f8890405ebd34107a6da9b39a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=%2BrfKD%2FuCG%2Bb8uIWsFj40IBBgO88%3D)


流形式写入:



let stream = fs.createWriteStream('./test.txt') stream.write("abcd1234", err => { if (err) { console.log("写入失败"); return } console.log("写入成功"); })


监视文件变化:



fs.watch('./logs/log-0.txt', () => { console.log(0) })


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5a44db99926e4960ad8c183f88c78f1e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=l0azwXMnYb%2BC7bXRgl%2FSQA%2BzO04%3D)  
 当手动更改txt文件时:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/9649ce513e1940d68baed419aabab2a2~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=qJnth9tsHTAAUxKv%2FJv71F2%2BmzY%3D)


  



---


  


#### 解析excel


依赖插件:node-xlsx


例:读取


![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9VGP4Ni-1624796714656)(media/1624099713855.png)]](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/7cdf3ccf441846008622552d22118947~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=XnqCCeMRE1nnSLbibRK8JwAtQmk%3D)



const nodeXlsx = require('node-xlsx') const fs = require('fs') var data = nodeXlsx.default.parse('./aaa.xlsx') console.log(data[0].data);


![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OsSlMPv-1624796714660)(media/1624099751861.png)]](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c5b9d26b8dcc46b2ad18f21e2ac7f1ce~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=QWi3iH02qXdJbLDJ3JjVedV5Kuc%3D)


写入:



const nodeXlsx = require('node-xlsx') const fs = require('fs') var data = [ { name:"籍贯表", data:[ ['姓名','年龄','籍贯'], ['张三','20','洛阳'], ['李四','21','扬州'] ] } ]; var buff = nodeXlsx.build(data); fs.writeFileSync('test.xlsx',buff)


  



---


  


#### crypto


crypto模块用来将字符串进行加密。



> 
> 项目中,我们的密码是需要进行加密的 - md5加密是定向的,不可逆的,不能被解密的,但是容易被暴力破解 - 将一些常用字符的组合加密,做成一本字典,从中进行查询
> 
> 
> 


查看所有的加密方式



console.log(crypto.getHashes());


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/08290791133a4e0fb8adec3d0f86b453~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=C4hIF1II91OHsIhdzDdKMGZvW1c%3D)  
 设置加密的hash方式



const md5 = crypto.createHash('md5')


进行加密



md5.update('123456')


输出加密结果 - 2进制、16进制



let result = md5.digest("hex") console.log(result);


![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/57e3ba8b07f646e9943f13b25a934af1~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=LWmNdgZ%2BpJMnqHNrrMb7kg9fEWI%3D)


  



---


  


#### http


##### 服务器介绍


Web服务器一般指的是**网站服务器(服务器:给用户提供服务的机器就是服务器)**,是指驻留因特网上某一台或N台计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,在服务器上还需要安装服务器软件,**目前最主流的三个Web服务器软件是Apache、 Nginx 、IIS**。


![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cW0R5eSU-1624796714661)(media/1624037165360.png)]](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a8aa50f7974d435a97be4458e47bee6b~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=G18px7qgqQNoayESUf3oMtyLs%2FI%3D)


ip地址


域名


协议


端口号


##### 创建服务器



request: 接受客户端请求对象,它包含了与客户端相关的数据和属性 request.url 客户端请求的uri地址 request.method 客户端请求的方式 get或post request.headers 客户端请求头信息(对象) .... response:服务器对客户端的响应对象 设置响应头信息 ,用于响应时有中文时乱码解决处理 response.setHeader('content-type', 'text/html;charset=utf-8') 设置状态码(常见的HTTP状态码有:200,404,301、302、304、403、401、405、500,502) response.statusCode = 200(默认是200) response.writeHead(statusCode, [reasonPhrase], [headers])) statusCode:状态码 reasonPhrase:状态描述 headers:头信息 response.write(响应数据) 可调用多次,最终会将多次数据拼接在一起响应 向客户端发送响应数据,并结束本次请求的处理过程 response.end('hello world')


启动服务



// 导入http模块 const http = require('http') // 创建web服务对象实例 const server = http.createServer() // 绑定监听客户端请求事件request // on方法做事件监听 server.on('request', (request, response) => {})

server.listen(8080, () => { console.log('服务已启动') })




> 

> req是请求报文 -  

>  console.log(req.url); // 请求路径  

>  list.php - get/post  

>  console.log( req.method ); // 请求方法

> 

> 

> 




很多情况下,我们需要从请求头中获取一些信息 console.log(req.headers); 通常在header中会获取:1.cookie 2.token令牌 req还可以用来获取请求主体

res设置响应报文的

res.end('ok') // end方法声明这次响应结束,有参数就表示响应的主体是end的参数

设置响应头 - 避免乱码 res.setHeader("content-type","text/html;charset=utf8") // 只能设置一个响应头 res.setHeader('aaa','bbbb')

设置状态码 - 给属性赋值 res.statusCode = 205

设置响应状态描述 res.statusMessage = 'ok'

设置响应头并设置状态码和状态描述 res.writeHead(404,'ok',{ 注意:设置响应头的时候,键不允许出现驼峰命名 "content-type":"text/html;charset=utf8", aaa:"bbb" })

设置响应主体 res.write("this is my server") res.write("我们都在认真的学习") 响应必须停止客户端才会接收到结果 res.end() 表示这次响应结束


##### 静态资源服务器



// 创建服务器有以下几步: // a. 导入 const http = require("http"); const path = require("path"); const fs = require("fs"); // b. 创建web实例 const server = http.createServer(); // c. 监听request事件 server.on("request", (req, res) => { // 获取当前用户访问的资源路径 let uri = req.url; // 由于“/”没有实体资源,需要将“/”做处理,如果访问“/”则让其对应访问“/index.html” if (uri == "/") { uri = "/index.html"; } ------------------------------------------------------------------ 默认情况下,浏览器在第一次请求网站的时候会访问“/favicon.ico”图标文件,如果没有也会出现404 果需要解决这个问题,则有3种方式: 方式1:去找个ico文件,存放在静态资源的public目录下,命名为“favicon.ico” 方式2:在处理的时候忽略“/favicon.ico”文件的处理,也就是下面的加了判断的写法 方式3:不管,不用处理,其不影响页面的显示

if(uri != '/favicon.ico'){
    // 读取文件(fs模块),将内容返回给用户(res.end)
    let filename = path.join("public", uri);
    // 判断文件是否存在
    if (fs.existsSync(filename)) {
        fs.readFile(filename, (err, data) => {
            if (!err) {
                // ok
                res.end(data);
            } else {
                // 不ok
                res.setHeader("Content-Type", "text/html;charset=utf-8");
                res.statusCode = 500;
                res.end("请求资源出现错误。。。");
            }
        });
    } else {
        res.setHeader("Content-Type", "text/html;charset=utf-8");
        res.statusCode = 404;
        res.end("你要找的资源失踪了。。。");
    }
}

}); // d. 监听端口,启动服务 server.listen(8080, () => { console.log("server is running at http://127.0.0.1:8080"); });


##### 获取get参数


第一种:



const url = require('url') const querystring = require('querystring') require('http').createServer((req, res) => { // 第一种 let a = req.url.split('?') console.log(a); res.end('11')

}).listen(3000)


在浏览器输入url :http://localhost:3000/?id=8&uname=w


效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/369bfb07ac144099a8f35bc0c84a9654~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=%2BGZVgy0giMoydGuuNZEGgTxPzqc%3D)


第二种:



const url = require('url') const querystring = require('querystring') require('http').createServer((req, res) => { // 第二种 let obj = url.parse(req.url, true).query console.log(obj); res.end('11') }).listen(3000)


在浏览器输入url :http://localhost:3000/?id=8&uname=w  
 效果:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d317337240034a95b4a656a49139b4d5~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=xAufxep2DSgNT6Ty8l91cZx7Odw%3D)  
 第三种:



const url = require('url') const querystring = require('querystring') require('http').createServer((req, res) => { // // 第三种 let query = url.parse(req.url).query let obj = querystring.parse(query) console.log(obj); res.end('11')

}).listen(3000)


在浏览器输入url :http://localhost:3000/?id=8&uname=w  
 实现:  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e44f073a7ebf4e45b35391df964a25c0~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=L7nz3koWQeY7zpiwp4cSjFKO2XM%3D)


##### 获取post参数


第一种:



require('http').createServer((req, res) => { if (req.url === '/') { let html = `

` res.setHeader('content-type', 'text/html;charset=utf8') res.end(html) } else if (req.url === '/post') { let data = '' req.on('data', chunk => { data += chunk; }) //数据接受后执行 req.on('end', () => { console.log(data); }) res.end(req.method) }

}).listen(3000)


第二种:



require('http').createServer((req, res) => { if (req.url === '/') { let html = `

` res.setHeader('content-type', 'text/html;charset=utf8') res.end(html) } else if (req.url === '/post') { let data = '' let arr = [] req.on('data', chunk => { arr.push(chunk) }) //数据接受后执行 req.on('end', () => { console.log(arr); //很多小buffer组成的数组 let buf = Buffer.concat(arr) console.log(buf.toString()); }) res.end(req.method) }

}).listen(3000)


  



---


  


##### 爬虫


利用http 提供的get  post 爬取数据



const http = require('http'); http.get(地址,data=>{ // 通过事件接收数据 })

http.post(地址,data=>{ // 通过事件接收数据 })


例:



// 爬虫 - 利用http提供的get和post方法来爬取数据 const http = require('http')

// 爬虫 http.get('xiaodiaodaya.cn/',data=>{ // console.log(data); // data是爬虫对象 - 获取数据 - 跟post请求的数据获取方式一样 let html = ''; data.on('data',chunk=>{ html += chunk }) data.on('end',()=>{ console.log(html); // 将爬回来的页面写在html中 require('fs').writeFileSync('./xiaohua.html',html) }) })


自动生成 `xiaohua.html`  
 ![在这里插入图片描述](https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b99b0aa7fa29467ea9e593c1efc6ca7e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771321704&x-signature=1s1zSIFgXkmGeSav%2BQ%2BGUnis%2FVM%3D)


  



---


  


##### 代理



const http = require('http') const proxy = require('http-proxy-middleware')

http.createServer((req, res) => { let url = req.url

res.writeHead(200, { 'Access-Control-Allow-Origin': '*' })

if (/^/api/.test(url)) { let apiProxy = proxy('/api', { target: 'm.lagou.com', changeOrigin: true, pathRewrite: { '^/api': ''

img img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化资料的朋友,可以戳这里获取