首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从0到1学习nodejs(3)

从0到1学习nodejs(3)

作者头像
y191024
发布于 2024-07-24 04:34:47
发布于 2024-07-24 04:34:47
15600
代码可运行
举报
运行总次数:0
代码可运行

最近太忙碌,只能晚上抽空学一下,后台有留言说让我分享一下这个视频的链接,十分感谢,已经添加到自动回复了,可以获取'nodejs'获取 ,视频还是不错的,老师讲的很好!

IP

IP的分类

IP是由32位二进制数字组成了,最多能表示2^32个IP地址,那就是4294967296(42亿)个IP,但是这个数量远远不够人们使用。因此就出现了区域共享家庭共享。

比如我们家庭中的这些设备,就形成了一个局域网,而路由器给我们分配的地址就是局域网IP,也就是私网IP

我们找运营商给我们拉网线以后,就可以给路由器再接一根线,接上这根线以后,我们的路由器就有了另一个IP,这就是公网IP,也叫做广域网IP。我们所说的共享IP,指的就是公网IP。

因此,每个家庭中的各个设备的局域网是可以复用的,他们只需要通过一个公网IP进行通信即可,这就大大减少了IP不够用的问题。

本地回环IP地址

这个地址是一定要记住的,永远指向当前本机(开发表示熟悉极了)

但是不仅仅是127.0.0.1,以下IP范围内的都是本地回环IP地址

端口

学习完IP接着学一下端口

作用:

比如说,有两台电脑,左边的主机想给右边的主机发送一些报文数据,但是右边的主机怎么知道用哪个应用程序来处理报文呢?这时候端口就起到了作用。

接下来就是HTTP服务了哈

HTTP模块

创建一个最简单的服务吧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 导入http模块
const http = require("http");
// 创建服务对象
const server = http.createServer((req, res) => {
  res.end("hello"); // 这里是设置响应体,并结束这个请求
});
// 监听端口,启动服务
server.listen(9000, () => {
  console.log("服务已启动..."); // 只有当服务成功启动才会执行
});

我们会发现如果响应的是中文的话会乱码

这个时候我们需要加一个响应头,告诉浏览器返回的结果是html,内容的字符集是utf-8的,让浏览器按照这样的方式解析

又遇到了一个问题,我的代码这样写报错了

GPT的解答是,试了下果然好了,可以注意一下。

每次修改都得重启,可以安装nodemon热更新

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i nodemon

如果我们想看哪个端口被占用了,我们可以打开资源监视器去找

获取请求报文

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require('http');
const server = http.createServer((req, res) => {
  console.log(req.method);
  console.log(req.url); // 只包含url中的路径和查询字符串
  // 获取请求头
  console.log(req.headers);
  console.log(req.headers.host);
  res.end('666')
})
server.listen(3000, () => {
  console.log('服务已启动...');
})

获取请求体

我们现在写一段这样的代码,就可以获取到请求体了,注意get请求一般是没有请求体的,我们可以使用postman来发post请求

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require('http')
const server = http.createServer((req, res) => {
  let body = ''
  req.on('data', (chunk) => {
    body+=chunk
  })
  req.on('end', () => {
    console.log(body);
    res.end('hello')
  })
})
server.listen(3000, () => {
  console.log('服务已启动');
})

获取请求路径和查询字符串

需要导入一个url模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require("http");
const url = require("url");

const server = http.createServer((req, res) => {
  console.log(url.parse(req.url));
});
server.listen(5000, () => {
  console.log("1111");
});

但是如果我们想要获取查询字符串的话,这样做还是不够方便,我们可以给parse方法加一个true参数

这样我们的query就是一个对象了

还有第二种方法,就是new URL()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require("http");

const server = http.createServer((req, res) => {
  const url = new URL(req.url, "http://127.0.0.1");
  console.log(url);
  console.log(url.searchParams.get("keyword"));
});
server.listen(5002, () => {
  console.log("服务已启动");
});

小测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require("http");
const server = http.createServer((req, res) => {
  const url = new URL(req.url, "http://127.0.0.1");
  res.setHeader("content-type", "text/html;charset=utf-8");
  const { method } = req;
  const { pathname } = url;
  if (method === "GET" && pathname === "/login") {
    res.end(
      "<div>请登录</div><label for=login>用户名: </label><input id='login'/>"
    );
  } else if (method === "GET" && pathname === "/reg") {
    res.end(
      "<div>请注册</div><label for=login>用户名: </label><input id='login'/>"
    );
  } else {
    res.end(""); // 注意处理,不然匹配不上的时候会
    // 一直处于连接状态无法停止
  }
});
server.listen(5002, () => {
  console.log("服务已启动");
});

设置响应报文

我们可以设置响应状态码等

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require("http");
const server = http.createServer((req, res) => {
  // 设置响应码
  res.statusCode = 201;
  // 设置响应头
  res.setHeader("content-type", "text/html;charset=utf-8");
  // 设置多个重名响应头
  res.setHeader("test", ["a", "b", "c"]);
  // 设置响应体
  res.write("设置的响应体"); // 会和下面的end拼接在一起,但是一般不会同时调用
  res.end("请求返回结果"); // write可以写多个,但是end不可以(多也不行少也不行)
});
server.listen(3001, () => {
  console.log("服务已启动...");
});

响应体返回HTML格式结果

我们发送请求以后,通常都不是单一的文本,有时候是页面,那就要返回HTML了,要怎么做到呢

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div class="response">我是响应结果</div>
  </body>
  <style>
    .response {
      color: skyblue;
      font-size: 20px;
    }
</style>
</html>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require("http");
const fs = require("fs");
const path = require("path");

const server = http.createServer((req, res) => {
// 这里不用path.resolve的话,../拼接不上去
  const filePath = path.resolve(__dirname, "../html/responseHtml.html");
  const html = fs.readFileSync(filePath);
  res.end(html);
});
server.listen("3002", () => {
  console.log("服务已启动");
});

扩展练习

现在我们将反应结果设置为了HTML,现在我们想要加入JS和css,我们第一反应应该都是在HTML中使用link和script引用,让我们看看这样会出现什么问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <link rel="stylesheet" href="./test.css" />
  </head>
  <body>
    <div id="response">我是响应结果</div>
  </body>
  // 注意script的位置哈,写在上面的话是获取不到元素的
   <script src="./test.js"></script>
</html>

这是引入的样式和JS

现在我们执行一下,我们会发现除了这个HTML写的文本,JS和css都没有生效,我们会发现,我们的css还有JS的请求返回结果都是HTML,这是因为我们发请求时的回调函数出现了问题,没有处理好

现在我们对发请求的回调函数做一下处理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const http = require("http");
const fs = require("fs");
const path = require("path");

const server = http.createServer((req, res) => {
  let { pathname } = new URL(req.url, "http://127.0.0.1");

  console.log(pathname);
  if (pathname === "/") {
    const filePath = path.resolve(__dirname, "../html/responseHtml.html");
    const html = fs.readFileSync(filePath);
    res.end(html);
  } else if (pathname === "/test.js") {
    const jsPath = path.resolve(__dirname, "../html/test.js");
    const js = fs.readFileSync(jsPath);
    res.end(js);
  } else if (pathname === "/test.css") {
    const cssPath = path.resolve(__dirname, "../html/test.css");
    const css = fs.readFileSync(cssPath);
    res.end(css);
  } else {
    res.end("<p>404 Not Fount</p>");
  }
});
server.listen("3003", () => {
  console.log("服务已启动");
});

现在就可以了

但是这种方式还是非常麻烦的,后面会解决这个问题

暂时先写到这吧,拖太久了,上班以后太懒了

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 睡不着所以学编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
9.12 VR扫描:帕胖新公司Anduril估值超10亿美元;微软考虑推出Quest版《我的世界》
近日,Oculus创始人Ricky Palmer创办的科技国防公司Anduril,完成了由Anderson Horovitz基金参投的一笔融资。截至目前,该公司估值已超过10亿美元。
VRPinea
2019/09/17
5170
9.12 VR扫描:帕胖新公司Anduril估值超10亿美元;微软考虑推出Quest版《我的世界》
1.6 VR扫描:Snap收购图像识别公司AI Factory;任天堂正研究采用AR的新方式
近日,市场研究机构SuperData发布《2019年数字游戏和互动媒体产业报告》。数据显示,2019年数字游戏产业和互动媒体产业规模同比增长4%达到1201亿美元。其中,手游达644亿美元,PC游戏达296亿美元,主机游戏达154亿美元,游戏相关视频达65亿美元,XR收入达63亿美元。
VRPinea
2020/02/12
5640
1.6 VR扫描:Snap收购图像识别公司AI Factory;任天堂正研究采用AR的新方式
8.16 VR扫描:VR社交平台AltspaceVR宣布回归;Facebook将推《部落冲突》AR体验
得图网络完成2000万融资,发力VR影像内容 得图网络于近期完成2000万融资,由浙江金控资本投资。得图是一家VR影像内容平台,通过得图云为用户提供全景内容采集展示及技术支持等服务。另外,得图网络同时
VRPinea
2018/05/14
8030
12.16 VR扫描:宝马推AR概念驾驶,Multiverse大作《Seeking Dawn》来袭!
宝马推AR概念驾驶,像“钢铁侠”一样开车 宝马将在2017年1月份的CES展(国际消费类电子产品展览会)上展出概念驾驶室,这是基于去年展示过的AirTouch手势控制技术上发展而来。这一名为HoloA
VRPinea
2018/05/15
6480
5.5 VR扫描:索尼演示VR手部全指追踪控制器原型;Facebook Q1非广告收入2.97亿美元
(VRPinea 5月5日电)今日重点新闻:GDC Summer 将以完全数字化形式开启,8月4-6日举办;索尼演示全新VR控制器原型,支持手部全指追踪;Facebook Q1非广告收入达2.97亿美元,Oculus产品销量为主要来源。
VRPinea
2020/05/14
4410
5.5 VR扫描:索尼演示VR手部全指追踪控制器原型;Facebook Q1非广告收入2.97亿美元
8.29 VR扫描:谷歌为奥利奥添加ADB VR测试命令;英特尔推出Movidius视觉处理芯片
英特尔推出Movidius视觉处理芯片,适配VR头显 日前,英特尔子公司Movidius宣布推出Movidius Myriad X视觉处理器(VPU),该处理器功能强大,主要用于基于视觉的设备的深度学
VRPinea
2018/05/14
8580
4.19 VR扫描:怒怼Facebook ,Snapchat发布新AR滤镜
Snapchat发布新AR滤镜 昨日,Snapchat发布了新的后置摄像头滤镜New World Lenses,该滤镜可以将物品和文本等虚拟对象叠加在现实场景中,社交平台的用户能够立即获取并使用。官方
VRPinea
2018/05/16
7090
4.30 VR扫描:微美全息完成8380万美元融资;阿迪达斯与Tooz合作开发AR眼镜
(VRPinea 4月30日讯)今日重点新闻:视觉全息服务商WIMI微美全息已完成8380万美元的融资,此次融资将用于研发、战略收购和常规的公司费用;阿迪达斯和Tooz展示了双方AR眼镜的合作情况,该AR眼镜仍处于 "概念设计 "阶段;VR体育游戏《CYBER TENNIS》登陆Oculus应用商店,售价19.99美元。
VRPinea
2021/05/17
4120
4.30 VR扫描:微美全息完成8380万美元融资;阿迪达斯与Tooz合作开发AR眼镜
3.22 VR扫描:Quest最佳游玩面积约58平米;Labo VR推出60多款游戏,支持DIY
近日,位于爱尔兰的AR/VR游戏工作室WarDucks,宣布已完成380万美元融资。由EQT Ventures领投,Suir Valley Ventures等参投。据悉,WarDucks将开设一个LBE AR游戏工作室,并邀请到John Romero(参与设计《毁灭战士》、《德军总部3D》)、Doug Kaufman(《文明2》、《Frontierville》)、Lawrence Schick(《上古卷轴OL》、《龙与地下城》)分别作为工作室的创意顾问、首席设计师、剧情策划。
VRPinea
2019/04/28
5740
3.22 VR扫描:Quest最佳游玩面积约58平米;Labo VR推出60多款游戏,支持DIY
2.3 VR扫描:苹果两个新专利曝光,下一代的iPhone会搭载VR吗?
苹果两个新专利曝光 潜藏其AR/VR可能性 苹果公司最近申请通过了两项新专利,该专利将允许通过一套移动AR系统监测周围的环境,并在VR环境下实时向用户显示信息。苹果在专利文件中称,该头显集摄像头、屏幕
VRPinea
2018/05/15
7110
3.31 VR扫描:不再满足于现实世界,支付宝VR Pay功能上线
支付宝VR支付平台上线,小米和华为支持 今日,蚂蚁金服开放平台正式上线VR Pay功能,小米和华为成为首批支持VR支付功能的VR平台。在购物、直播、游戏、社交等VR场景中,用户无需跳转,就可以直接进行
VRPinea
2018/05/15
8200
6.21 VR扫描:三星被爆料:正在研发次世代独立VR设备,像素密度可达2000 PPI
三星被爆正在研发次世代独立VR设备 今日,有消息称,三星正在研发一款独立运行的VR设备(不需要插入手机)。这款VR设备将使用OLED显示屏,而像素密度将达到2000 PPI。如果爆料不假,三星正在研
VRPinea
2018/05/14
6250
12.4 VR扫描:中科创达3100万欧收购图像视觉公司MMS;ZED Mini可将Rift/Vive变成AR头显
据悉,智能眼镜供应商Vuzix推出的AR眼镜Vuzix Blade开发套件现已接受预订。该开发套件包括一副预生产的Vuzix Blade智能眼镜(届时可升级至商业版)、专属访问权限的软件开发工具包(S
VRPinea
2018/05/17
7760
4.28 VR扫描:苹果更新基于LiDAR的AR空间特效;Snapchat收购地图平台Pixel8Earth 2
(VRPinea 4月28日讯)今日重点新闻:苹果Clips更新3.1版本,基于LiDAR AR空间特效;Snapchat收购地图平台Pixel8Earth,将完善Snapchat在AR领域的功能推进;AR头显Campfire完成800万美元融资,旗下头显同时支持VR和AR功能。
VRPinea
2021/05/17
6160
4.28 VR扫描:苹果更新基于LiDAR的AR空间特效;Snapchat收购地图平台Pixel8Earth 2
12.23 VR扫描:来来来,你的抢红包姿势已经out啦!
传Snapchat欲收购以色列AR创业公司Cimagine 有外媒报道称,“阅后即焚”照片分享应用Snapchat正在以3000万美元至4000万美元的预估价,收购以色列增强现实创业公司Cimagin
VRPinea
2018/05/15
8390
8.28 VR扫描:这口狗粮我吃了!雪诺和龙妈铺起友谊的小床,HBO为《权力的游戏》推AR滤镜
Oculus正在考虑为Rift增加第四个传感器支持 Oculus表示,他们正在考虑为Rift增加第四个传感器支持,而许多人已经自行测试成功。目前,用户可以使用单个传感器实现标准的Rift设置;用两个传
VRPinea
2018/05/15
7530
9.18 VR扫描:VINCI获美空百万美元订单;高通展示无线化XR头显设计方案
据悉,品牌体验设计公司Accomplice已完成对体验式设计机构Design & Manufacturing、VR/AR技术开发商Spatial Cinematics的收购。收购之后,Design & Manufacturing和Spatial Cinematics都将整合至Accomplice品牌,扩展Accomplice的产品组合和设计能力。
VRPinea
2019/09/19
4440
9.18 VR扫描:VINCI获美空百万美元订单;高通展示无线化XR头显设计方案
1.18 VR扫描:Rokid完成近亿美元融资;任天堂推Nintendo Labo套装,定义Switch新玩法
AI公司Rokid完成近亿美元融资,淡马锡领投 据悉,AI公司Rokid近日完成了近亿美元的融资,此次融资由淡马锡领投,瑞士信贷、CDIB、IDG资本等机构跟投。Rokid方面表示,新一轮融资将主要
VRPinea
2018/05/18
9590
10.20 VR扫描:LG申请LG UltraGear VR商标,头显或于明年初上线
LG申请LG UltraGear VR商标,头显或于明年初上线 欧盟知识产权局数据库显示,LG在2017年10月17日向其提交了商标“UltraGear”的注册申请,商标的描述包括了VR头显,头戴式视
VRPinea
2018/05/17
1.1K0
4.8 VR扫描:谷歌Daydream迎来新更新;代号为“Sydney”的HoloLens 2将搭载ARM处理器
近日,谷歌更新了Daydream功能,带来了一项全新的控制面板功能。同时,在更新后,Daydream用户将迎来一系列的新应用和游戏聚合,以及值得关注的视频系列。据悉,这项新功能已于日前推送,并通过Tw
VRPinea
2018/05/18
5840
推荐阅读
9.12 VR扫描:帕胖新公司Anduril估值超10亿美元;微软考虑推出Quest版《我的世界》
5170
1.6 VR扫描:Snap收购图像识别公司AI Factory;任天堂正研究采用AR的新方式
5640
8.16 VR扫描:VR社交平台AltspaceVR宣布回归;Facebook将推《部落冲突》AR体验
8030
12.16 VR扫描:宝马推AR概念驾驶,Multiverse大作《Seeking Dawn》来袭!
6480
5.5 VR扫描:索尼演示VR手部全指追踪控制器原型;Facebook Q1非广告收入2.97亿美元
4410
8.29 VR扫描:谷歌为奥利奥添加ADB VR测试命令;英特尔推出Movidius视觉处理芯片
8580
4.19 VR扫描:怒怼Facebook ,Snapchat发布新AR滤镜
7090
4.30 VR扫描:微美全息完成8380万美元融资;阿迪达斯与Tooz合作开发AR眼镜
4120
3.22 VR扫描:Quest最佳游玩面积约58平米;Labo VR推出60多款游戏,支持DIY
5740
2.3 VR扫描:苹果两个新专利曝光,下一代的iPhone会搭载VR吗?
7110
3.31 VR扫描:不再满足于现实世界,支付宝VR Pay功能上线
8200
6.21 VR扫描:三星被爆料:正在研发次世代独立VR设备,像素密度可达2000 PPI
6250
12.4 VR扫描:中科创达3100万欧收购图像视觉公司MMS;ZED Mini可将Rift/Vive变成AR头显
7760
4.28 VR扫描:苹果更新基于LiDAR的AR空间特效;Snapchat收购地图平台Pixel8Earth 2
6160
12.23 VR扫描:来来来,你的抢红包姿势已经out啦!
8390
8.28 VR扫描:这口狗粮我吃了!雪诺和龙妈铺起友谊的小床,HBO为《权力的游戏》推AR滤镜
7530
9.18 VR扫描:VINCI获美空百万美元订单;高通展示无线化XR头显设计方案
4440
1.18 VR扫描:Rokid完成近亿美元融资;任天堂推Nintendo Labo套装,定义Switch新玩法
9590
10.20 VR扫描:LG申请LG UltraGear VR商标,头显或于明年初上线
1.1K0
4.8 VR扫描:谷歌Daydream迎来新更新;代号为“Sydney”的HoloLens 2将搭载ARM处理器
5840
相关推荐
9.12 VR扫描:帕胖新公司Anduril估值超10亿美元;微软考虑推出Quest版《我的世界》
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档