[前端基础]Node.js简单操作,手把手教你搭建一个轻量级应答服务器(会继续补充操作细节,欢迎讨论)

news2024/11/20 20:27:56

注意:前置知识:回调函数,异步,ajax技术,端口

目录

1.什么是node.js

2.模块的概念

3. 回调函数

4.关于文件的管理

5.关于流的操作

6.关于构建服务器:前端部分,如何向后端发送请求

7.后端创建简单的服务器对象

8.后端如何处理请求

9.前端如何处理返回的数据

10.简易应答和访问的实现代码

11.关于node.js的其他补充


1.什么是node.js

一般来说,我们很少用javascript去构建一个后端应用,而是把js划分到经典前端三剑客之一(话说前两天看到一个大哥用js在前端写出了云端图片处理软件........牛蛙牛蛙).把JS解释为机器代码的引擎,其实就是浏览器的底层机制.

而Node.js不是一个编程语言或者框架,而是一个环境,能够脱离浏览器构建一个能让js跑起来的环境.

如果想要区分当前运行环境是浏览器还是node.js,可以了解一下原型prototype,其中浏览器的顶层应该是window,而node.js的底层却是global.

下面不会特别区分nodejs的语法,只会展示一些有关的操作,因为很多其实都是es6的内容这个东西也没有必要特意去学)

其实这篇也近乎解释了为什么vue这类框架需要提前安装node.js

2.模块的概念

模块仍然是es系列标准之一,在这里,每个文件我们都可以将其视为一个模块,或者一个模块的生产者,一个文件可以选择自己想要抛出哪些东西,形成一个其他文件可以require的对象

举个例子

我们有一个名为app2.js的文件,里面要抛出两个东西

把这两个东西以一个对象的形式抛出,就可以在其他的模块中读取到

 在其他的文件中,以对象的形式进行引入,就可以调用这个模块内的属性,函数之类的东西

模块化开发是一个非常重要的思想

3. 回调函数

在大多数异步方法中,回调函数可以作为异步处理的一个机制,比如某个函数内置了一个回调函数的参数,就可以设置这个回调函数,来进行异步完成操作以后的行为

关于具体的回调函数的内容,可以详见前面关于异步操作的解释

回调函数是异步操作的一部分,当异步操作完成后会触发回调函数的执行。
在 Node.js 中,回调函数的参数名称并没有限制,通常根据异步操作的结果类型和具体含义来命名参数。一般来说第一个是错误类型

4.关于文件的管理

文件关系的模块为fs,流相关的东西也在这里

var fs=require("fs");

文件的管理分为两种,异步和同步,主要的操作其实也就四个,读入,读出,创建文件夹,删除文件夹

(1)同步操作

同步完成文本文件的读入和读出

用一个变量进行接收,接收的时候要注意编码
var readme=fs.readFileSync("./readme","utf-8");
然后向指定位置写出
fs.writeFileSync("./writeme",readme);

同步完成文件夹的赋值和删除省略

(2)异步操作,区别就在于会异步执行回调函数

所以比如读出的回调函数中,可以启动写入,让逻辑更加清晰

var readme2=fs.readFile("./readme","utf-8",()=>{
    fs.writeFile("./writeme",readme+",and you are finished too!",()=>{
        console.log("you are finished");
    });
});

异步进行文件加创建

fs.mkdir("stuff",()=>{
    console.log("创建成功");
});
fs.rmdir("stuff",()=>{
    console.log("删除成功")
});

5.关于流的操作

流其实和java里面是差不多的东西,也是一种文件处理机制,不过比Java简单太多了

此外,在nodejs构成的服务器端,request和response也具有流的性质

流其实也是eventEmitter的一个实例,所以也具有监听事件的方法on

(对于写入流,有两个事件,data和end,其中data是每一部分文件传入结束时触发的,传入回调函数的参数就是这一部分数据.而end事件是整体的数据传入完成以后才会触发的,data事件会触发多次,但是end事件只会触发一次)

var readStream=fs.createReadStream("./readme","utf-8");
var writeSeam=fs.createWriteStream("./writeme","utf-8");

readStream.on("data",(data)=>{
    console.log(data);//这是个异步方法
    writeSeam.write("new hugdw",()=>{
        console.log("回调成功");
    });
})

解释游戏啊这段代码,这两个流分别根据写入和写出防线构建了两个对象,每次readStream读到了一定数目的数据,就触发data事件,我们根据这个回调函数完成写入流的操作

6.关于构建服务器:前端部分,如何向后端发送请求

发送请求一共是两种:get请求,这种请求主要用来从后端获取大量数据,也可以通过url的方式向后端传递几个简单的参数

          var xhp=new XMLHttpRequest;
           xhp.open(GET,"http://localhost:3030");
           xhp.onreadystatechange=(()=>{
             ........................
           });
           xhp.send();

post请求:主要用于往后端传入大量数据,区别就在于open函数中的第一个参数改成POST

           var xhp=new XMLHttpRequest;
           xhp.open(method,"http://localhost:3030");
           xhp.onreadystatechange=(()=>{
             ..................................
           });
           xhp.send("post发送请求的内容");

7.后端创建简单的服务器对象

服务器有关的东西在模块http中,先引入这个模块

var http=require("http");

然后利用http模块中的createServer函数,创建一个服务器,这个函数中内嵌着一个回调函数作为参数使用,这个参数带有两个参数,就是请求体对象和回复体对象

在这里再谈报文格式显然有点超出格式了,所以我们只说需要干些什么

设置返回状态码,设置返回报文头,以及返回体

var http=require("http");
var server=http.createServer((req, res)=>{
    res.statusCode=200;          //设置状态码
    res.setHeader('Access-Control-Allow-Origin', '*');  //设置头
    if(req.method==='POST'){              //根据请求的方式确定如何处理数据
       //传回来的大量数据使用流的方式进行处理
       req.on("data",(data)=>{
           console.log(data);
       });
        req.on("end",()=>{
            console.log("已经完成请求了");
        });
       res.end("来自后端,经过POST请求的数据");
    }else{
       res.end("来自后端,经过GET请求的大量数据");

    }
})

最后监听端口,

端口就相当于这个服务器对象对外开放的窗口,前端需要从端口访问这个进程,才能有结果

server.listen("3030","127.0.0.1",()=>{
    console.log("服务器开始监视3030端口")
});

8.后端如何处理请求

(1)如果是post请求,我们主要需要把req中带来的数据给读取即可

建议使用流的方式读取

req.on("data",(data)=>{
           console.log(data);
       });
        req.on("end",()=>{
            console.log("已经完成请求了");
        });

(2)如果是get请求,我们需要往前端传入数据

按照目前来说,使用end函数进行返回,是最简单的方式

res.end("来自后端,经过GET请求的大量数据");

9.前端如何处理返回的数据

前端处理返回数据的方式目前只学习了简单数据,太大的数据需要改变为流对象

这个后面有缘再说吧QWQ

xmlhttprequest对象中,有一个response对象,这个东西就算返回的数据

读取示例
console.log(xhp.response);

10.简易应答和访问的实现代码

var http=require("http");
var server=http.createServer((req, res)=>{
    res.statusCode=200;          //设置状态码
    res.setHeader('Access-Control-Allow-Origin', '*');  //设置头
    if(req.method==='POST'){              //根据请求的方式确定如何处理数据
       res.end("来自后端,经过POST请求的数据");
    }else{
       res.end("来自后端,经过GET请求的大量数据");
    }
})

server.listen("3030","127.0.0.1",()=>{
    console.log("服务器开始监视3030端口")
});

前端代码如下

function detchData(method){
           var xhp=new XMLHttpRequest;
           xhp.open(method,"http://localhost:3030");
           xhp.onreadystatechange=(()=>{
               if(xhp.readyState===4 && xhp.status===200){
                   //这里根据不同的情况返回不同的数值
                   console.log(xhp.response);
               }
           });
           xhp.send("post发送请求的内容");
       }

11.关于node.js的其他补充

(1)NPM包管理机制

npm可以理解为一个开源的社区?其实是nodejs的模块包管理,通过npm的方式可以获得别人弄好的轮子(比如常用的express.js,可以大大简化操作)
或者可以理解为一个共享机制?可以用来下载别人的包
npm是node.js自带的一个命令

(2)介绍另一个启动方式

nodemon,一个工具,检测文件改变,然后会重启后端
使用npm的方式进行安装
启动项目的方式也从node变成了nodemon
这个东西也可以到时候写到脚本里面
 

(3)package.json

这个东西可以说是老朋友了,就目前我们接触到的来说,有两种用法

1.记录着我们在项目中的依赖,启用指令

npm install

就可以读取记录信息,可以把用到的模块重新下载

这种是方便接收其他人的项目

2.这个文件中内置着某些启动脚本,idea启动也是根据这个json文件中的脚本来进行的

比如我们想要改成nodemon方式启动项目,就可以在这个文件里修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/450738.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STL标准模板库 vector容器与迭代器入门

STL五大件 标准模板库vector容器:vector 声明初始化vector 容器 :push_backvector 容器 :push_back的问题vector容器:push_back的问题,reserve解决 vector容器:insert函数vector容器:insert函数…

【从零开始玩量化17】如何python+QMT完成自动化交易?(全网最详细入门教程)

一、什么是QMT 此部分为扫盲内容,有一定了解者可以跳过。 概念 它是一款量化交易客户端软件,由一家叫做迅投公司出品,可以直接登录你的券商账号进行股票交易,但与同花顺/通信达不同的是,它暴露了基于python的交易API&…

【人生苦短,我学 Python】进阶篇——异常处理(Day16)

写在前面:大家好!我是【AI 菌】。我热爱AI、热爱分享、热爱开源! 这博客是我对学习的一点总结与记录。如果您也对 深度学习、机器视觉、算法、Python、C 感兴趣,可以关注我的动态,我们一起学习,一起进步~ 我…

Python小姿势 - 可选知识点:

可选知识点: 列表推导式 列表和字典推导式 字典推导式 生成器表达式 带条件的生成器表达式 解析XML 解析JSON 使用Requests和BeautifulSoup爬虫 Python并发编程 Python多线程编程 Python多进程编程 Python异步编程 Python装饰器 Python闭包 Python模块化 Python类和…

PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电

​ PM510V16 3BSE008358R1嵌入式卡件用于励磁系统多用于工业发电 物联网与工业自动化控制系统的联系 当今,物联网可谓是在各大媒体出镜率最高、而且与“智能”联系密切的名词之一。从“管理、控制、智能”的角度来看,其实物联网与工业自动化是一脉相承的…

Kafka技术基础

Apache Kafka发源于LinkedIn,于2011年成为Apache的孵化项目,随后于2012年成为Apache的主要项目之一,是消息队列的一种实现方式,提供消息的持久化。Kafka使用Scala和Java进行编写。Apache Kafka是一个快速、可扩展的、高吞吐、可容…

IEEE-TMI:张孝勇团队开发小鼠精细脑结构自动分割的深度学习算法

近日,复旦大学类脑智能科学与技术研究院青年研究员张孝勇课题组联合德国亥姆霍兹慕尼黑研究中心,在医学图像处理领域顶尖期刊《IEEE医学影像汇刊》(IEEE Transactions on Medical Imaging,TMI) 发表了题为《MouseGAN:用于小鼠大脑…

OpenCV 模板匹配 matchTemplate

一、模板匹配概念 模板匹配是一项在一副图像中寻找与另一幅模板图像最匹配(相似)部分的技术。模板匹配不是基于直方图的,而是通过在输入图像上滑动图像块(模板)同时对比相似度,来对模板和输入图像进行匹配的…

【IoT】如何使用软件加密(文件夹加密工具.exe),并破解工具

目录 第一步:显示隐藏的文件。 第二步:将隐藏文件变成文件夹。 第三步:解密文件。 有时候出差或者有些商务场合,需要对一些敏感文件做一下简单的加密,这样在分享内容的时候,可以起到初步的保护作用。 当…

Windows利用easyBCD装Ubuntu双系统

一、准备材料: 1、easyBCD软件(我用V2.3版本) 2、Ubuntu系统(我用的12.04版本ubuntu-12.04-desktop-i386.iso) 二、配置空闲分区 1、右击“计算机”--->管理--->右击某个自己分配的分区--->选择“压缩卷”…

Deep Bidirectional Language-Knowledge Graph Pretraining论文阅读

Deep Bidirectional Language-Knowledge Graph Pretraining github代码 摘要 最近的工作表明,知识图(KG)可以补充文本数据,提供结构化的背景知识, 为推理提供有用的支架。然而,这些作品并没有经过预先的训练来学习大规模的两种…

央视推荐的护眼灯是哪款?盘点央视推荐的护眼灯排名

护眼灯是生活中最常见的照明工具,许多人担心品质不过关 不合格的护眼灯会造成视损害 建议在选购护眼灯时: 首先看清楚产品的具体标识,其中就包括有产品的生产厂家,生产地址以及他们的产品型号 看产品规格和是否获得了国家的相关…

博睿数据蝉联中国APM市场份额第一,Bonree ONE春季正式版重磅发布

日前,IDC发布《中国IT统一运维软件产品市场跟踪报告,2022H2》,2022下半年中国APM市场环比增长近10%。博睿数据以市场份额达18.28%蝉联APM应用性能监控市场份额第一。 追求卓越,顺势而为 博睿数据作为中国领先的一体化智能可观测平台&#xf…

今天主要谈谈关于申请美国专利的一些问题

进入2021年,国家更多的开始鼓励在国外开展业务的企业去布局国外专利,提升企业海外竞争力。无他,着实是我们在知识产权保护方面起步太晚,已经吃亏了太久,专利掣肘,技术卡脖子,勤勉的为别人打工。…

Domino自带的JSON校验工具

大家好,才是真的好。 JSON数据在Notes/Domino已经变得非常重要。从Domino 10开始,在LotusScript语言中就加入了对JSON数据处理功能。在管理中,我们知道,从Domino 12版本开始就支持Domino自动化配置,也是使用JSON数据作…

利用ESP32-C3实现一个风扇PWM控制器,可网页操作

1简介 这段代码是一个基于ESP32开发板的PWM控制器,可以通过网页输入控制参数并显示在屏幕上,通过PWM输出引脚控制风扇的转速,还可以测量风扇的转速并在屏幕上显示。此外,代码还具备显示当前时间、显示Wi-Fi连接信息等功能。 2函数…

【Git基础】常用git命令(三)

文章目录 1.版本回退1.1 没有commit的情况1.2 已经commit但没有push的情况1.3 已经push到远端仓库的情况 2. 删除文件2.1 从工作区删除文件2.2 使用git rm命令删除文件2.3 永久删除文件2.4 永久删除文件的步骤拆解 3. 查看指定文件的修改3.1 查看文件的所有commit3.2 查看所有c…

亚控组态王与EXCEL通信

先创建一个IO设备:DDE类型 创建一个变量: 创建一个窗口,建立一个文本显示并关联前面建立的变量 先打开一个EXCEL文件(注意:WPS是不兼容的,必须先打开EXCEL文件,否则会报错) …

云原生|kubernetes|rancher-2.6.4安装部署简明手册

前言: rancher是一个比较特殊的开源的kubernetes管理工具,特殊在它是一个名称为k3s的简单kubernetes集群,而该集群是在kubernetes集群内的。 OK,本文将讲述如何在centos7服务器上,在已有的kubernetes-1.23.15集群内,…

基于STM32的电阻、电容测量(NE555芯片RC振荡法)

文章目录 前言一、电路图1.电阻测量公式2.电容测量公式 二、代码实现1.外部中断代码2.定时器中断处理数据 总结 前言 做的一个关于电阻和电容的测量电路,都是比较通用的。经过实际测试,电容测量电路还是可以的,电阻测量电路有一个缺点就是&a…