首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【NodeJS】归纳篇(一)数据请求
前端修罗场
2023/10/07
2480
nodejs基础-HTTP
步骤: 1,加载http模块 2.创建http服务 3、为http服务对象添加request事件处理程序 4·开启http服务监听,准备接收客户端请求 注意: 1,浏览器显示可能是乱码,所以可以通过.res.setHeader("Content-Type", 'text/plain; charset=utf-8');设置浏览器显示时所使用的编码. 2. Chrome浏览器默认无法手动设置编码,需要安装"Set Character Encoding"扩展. 3,演示一下设置Content-Type-text/html'和"Content-Type-text/plain的区别.
eadela
2019/09/29
6040
nodejs基础-HTTP
使用noode.js创建一个服务器
打开gitbash,切换到js文件当前的文件夹,然后输入node index.js(index.js是我的js文件名,反正你们取什么名就输入啥名)
bamboo
2019/01/29
1.7K0
使用noode.js创建一个服务器
nodejs基础和核心api
前端关心的是浏览器的bom和dom。node关注的是操作系统(fs,net,database,buffer,event,os)
一粒小麦
2019/07/18
1.1K0
nodejs基础和核心api
node.js:简单的HTTP服务器
姓王者
2024/12/20
2360
node.js:简单的HTTP服务器
Node.js基本数据处理
post会分多次发送给服务器端因为post较大,不能一次性发送,所以在接收时我们也要一段一段的接收 接收简单post
切图仔
2022/09/14
6010
nodejs核心api-http模块
我们知道传统的HTPP服务器会由Aphche、Nginx、IIS之类的软件来担任,但是nodejs并不需要,nodejs提供了http模块,自身就可以用来构建服务器,而且http模块是由C++实现的,性能可靠。大部分的node使用者,都是用node来做Web API的,而HTTP模块是提供Web API的基础。为了支持所有的HTTP应用,node中的HTTTP模块提供的API是偏向底层化的。利用HTTP模块,我们可以简单快速搭建一个Web Server。
conanma
2022/01/04
2.6K0
HTTP请求与响应处理
客户端向服务器端发送请求时,有时需要携带一些客户信息, 客户信息需要通过请求参数的形式传递到服务器端,比如登录操作。
清出于兰
2020/10/29
1.1K0
HTTP请求与响应处理
Node.js基础常用知识点全总结
Node.js是一个javascript运行环境。它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP、Java、Python、.NET、Ruby等后端语言平起平坐。
害恶细君
2022/11/22
3.7K0
Node.js基础常用知识点全总结
【nodejs】手写简易版 koa 及常用中间件
首先我们要实现 koa 的 use 和 listen 方法,我们这样使用 MyKoa。
一尾流莺
2022/12/10
8320
【nodejs】手写简易版 koa 及常用中间件
Node.js初探(一)——fs、path、http
浏览器中有JS解析引擎:每个浏览器的解析引擎都不一样,Chrome浏览器中的V8解析引擎最好。
conanma
2022/01/05
1.3K0
NodeJS后台
1.切换盘符 e: 2.改变目录 cd 目录名 3.执行程序 node xxx.js
达达前端
2019/07/03
1.9K0
NodeJS后台
[NodeJS]创建HTTP、HTTPS服务器与客户端
当从客户端请求流中读取到数据时会触发data事件,当读取完客户端请求流中的数据时触发end事件。
奋飛
2019/08/15
5.6K0
06_Node.js服务器开发
Node.js开发属于服务器开发,那么作为一名前端工程师为什么需要学习服务器开发呢?
张哥编程
2024/12/13
2480
06_Node.js服务器开发
实现简单的 Koa
koa 为了能够简化 API,引入上下文 context,将原始请求对象 req 和 响应对象 res 封装并挂载到 context 上,并且在 context 上设置 getter 和 setter,从而简化操作
Cellinlab
2023/05/17
3070
实现简单的 Koa
nodejs基本使用
  Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。
隔壁老陈
2023/03/10
1.2K0
解决跨越的几种方案
在项目中,我们常常遇到跨域的问题,虽然在你的项目里,脚手架已经100%做好了本地代理、或者运维老铁在nginx中也已经给你做了接口代理,所以你遇到跨域的概率会少了很多,但是在传统的项目中,在那个jquery的横行时代,或者你接手了一个祖传项目时,跨域问题会是时有发生,本文只做笔者了解跨域的通用解决方案,希望在实际项目中对你有些思考和帮助。
Maic
2022/07/28
5060
解决跨越的几种方案
请求响应原理及HTTP协议
网站应用程序主要分为两大部分:客户端和服务器端。 客户端:在浏览器中运行的部分,就是用户看到并与之交互的界面程序。使用HTML、CSS、JavaScript构建。 服务器端:在服务器中运行的部分,负责存储数据和处理应用逻辑。
梨涡浅笑
2020/10/29
1.5K0
请求响应原理及HTTP协议
如何使用node的http模块部署前端build包
在Web开发中,经常需要搭建一个能够提供静态文件访问的服务器。无论是用于本地开发调试,还是用于部署网站,这都是一个常见的需求。本篇文章将介绍如何使用Node.js和其内置的HTTP模块来创建一个简单的静态文件服务器。
用户6297767
2023/11/21
4890
nodejs的事件处理机制以及事件环机制
ES6标准发布后,module成为标准,标准的使用是以export指令导出接口,以import引入模块,但是在我们一贯的node模块中,我们采用的是CommonJS规范,使用require引入模块,使用module.exports导出接口。
Dream城堡
2018/10/12
1.1K0
nodejs的事件处理机制以及事件环机制
相关推荐
【NodeJS】归纳篇(一)数据请求
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档