Node.js学习

Node.js学习

Node.js简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。
Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP、Python、Perl、Ruby 等服务端语言平起平坐的脚本语言。 发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。
Node对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好。V8引擎执行Javascript的速度非常快,性能非常好。 Node是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node 使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

一、学习Node.js前首先了解模块化编程思想
模块化是一种设计思想,利用模块化可以把一个非常复杂的系统结构细化到具体的功能点,每个功能点看做一个模块,然后通过某种规则把这些小的模块组合到一起,构成模块化系统。

模块化的特点
生产效率高,灵活架构,焦点分离,多人协作互不干扰。 方便模块间组合、分解
维护成本低
可分单元测试,方便单个模块功能调试、升级

程序模块化与现实生活中的模块化相似,从程序开发角度,模块化是一种开发模式,也有两个特点:
(1)开发效率高:方便代码重用,对于别人开发好的模块功能可以直接拿过来使用,不需要重复开发类似的功能。
(2)维护成本低:软件开发的周期中,由于需求经常发生变化,最长的阶段并不是开发阶段,而是维护阶段,使用模块化开发的方式更容易维护。

二、Node.js入门
随着互联网的发展,全栈工程师(Full Stack Engineer)的概念开始兴起,全栈即包括用户界面、业务逻辑、数据建模、服务器、网络及环境等。这意味着,全栈工程师要熟练处理各层间的交互。而现在,有了Nodejs的出现,用JavaScript语言既可以进行客户端开发,又可以进行服务器端的开发,还可以与数据库交互。

客户端与服务端:
在这里插入图片描述

客户端与服务端(Node):
在这里插入图片描述
JavaScript在客户端和服务端的区别:
客户端的JavaScirpt不仅应用核心语法ECMAScript,还会操作DOM和BOM,常见的应用场景如用户交互、动画特效、表单验证、发送Ajax请求等。
服务端的JavaScirpt应用核心语法ECMAScript,但是不操作DOM和BOM。它常常用来做一些在客户端做不到的事情,例如操作数据库、操作文件等,另外,在客户端的Ajax操作只能发送请求,而接受请求和做出响应的操作就需要服务端的JavaScript来完成。

Node.js的特点和优势:
它是一个Javascript运行环境
依赖于Chrome V8引擎进行代码解析
事件驱动(event-driven)
非阻塞I/O(non-blocking I/O)
轻量、可伸缩,适于实时数据交互应用
单进程,单线程

开始前还要安装和配置Node.js
下载地址:[https://nodejs.org/en/]

REPL运行环境:
为了使开发者方便测试JavaScript代码,Node.js中提供了一个名为REPL(Read-Eval-Print-Loop)的可交互运行环境,当开发者输入JavaScript表达式,按下回车键后,REPL运行环境中将显示该表达式的运行结果。然后继续等待下一次用户输入,这种输入和显示结果的形式是循环的。
打开终端,输入“node”命令并按下回车键,即可进入REPL运行环境
Node.js为REPL运行环境提供了一些常用命令
在这里插入图片描述
global对象和模块作用域
在Node.js中,天生就是模块化的,默认声明的变量、函数都属于当前文件模块,都是私有的,只在当前模块作用域内可以使用,那么Node.js中是否只有模块作用域?答案是否定的,如果想在全局范围内为某个变量赋值,可以应用全局对象global。Node.js中的global对象类似于浏览器中的Window对象,用于定义全局命名空间,所有全局变量(除了 global 本身以外)都是global对象的属性,在实际使用中可以省略global。
global对象和模块作用域
.require()从外部获取一个模块的接口
exports,module.exports向外开放变量、函数等
在Node.js中,global对象定义了全局命名空间。当我们定义了一个全局变量时,这个变量同时也会成为全局对象global的属性,反之亦然。可以说在全局作用域中,任何变量、函数和对象都是global对象的一个属性值。

_dirname表示当前文件所在的目录
_filename表示当前正在执行的脚本的文件名。
Node.js的全局函数:
在这里插入图片描述
console对象提供的函数
在这里插入图片描述
在模块加载过程中,对于多次使用同一模块标识加载模块的情况,Node.js只会加载一次,这是由于第一次加载某个模块时,Node.js会缓存该模块,再次加载时将从缓存中获取。所有缓存的模块保存在 require.cache 中,可以手动的删除模块缓存。
三、异步编程和包资源管理
JavaScript的执行环境单线程。单线程一次只能完成一件任务,如果有多个任务,就需要等待前面一个任务完成,再执行后面的一个任务。Node.js中加入了异步编程模块。异步编程模型保证了Node.js快速响应。如果每件事情按照顺序依次进行就是同步。如果多件事情可以同时进行即异步。
回调函数:
回调函数是指函数可以被传递到另一个函数中,然后被调用的形式。这样的“回调”在Node.js中到处被使用,典型的应用就是异步函数的异常处理。下面通过代码的演变来学习回调函数的作用及使用。
当我们使用异步代码去做一件事时,不能预测这件事什么时候做完,其他的事情还在继续,这时我们给异步代码准备一个包裹,当异步代码有了执行结果时可以将结果放到这个包裹里,我们需要在哪里使用这个结果就从包裹取出。
fucntion 函数名(arg1,arg2,callback){} 函数名称通常为callback,在封装异步执行代码的时候,优先把 callback作为函数的最后一个参数出现
callback(err,result); 把代码中出现的错误作为 callback 回调函数的第一个参数进行传递。把真正的返回的结果数据,传递给 callback 的第二个参数。
包:
包目录结构
在这里插入图片描述
package.json文件属性说明
在这里插入图片描述
NPM包管理工具常见的使用场景有以下三种:
允许用户从NPM服务器下载别人编写的第三方包到本地使用。
允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。
包加载规则
在加载的时候,Node.js默认会把它当做核心模块去加载,如果发现标识名不是核心模块,就会在当前目录的node_moudules目录下寻找。如果没有找到,Node.js会从当前目录的父目录的node_modules里搜索,这样递归下去直到根目录。如果找到了该标识名的子目录,Node.js将会找到该子目录下的package.json文件,获取该文件中main属性的值,根据main属性指定的路径值进行加载。这样做的好处是在用户使用第三方模块的时候,不用关心入口模块是那个文件。
四、Node.js文件操作
1、文件写入
fs核心模块的模块标识为“fs”,所以加载该模块可以使用如下语句。
var fs = require(‘fs’);
同步写入---- fs.writeFileSync(file, data[, options]);
异步写入----fs.writeFile(file, data[, options], callback);
在这里插入图片描述
Options参数值为一个对象,在该对象中指定读取文件时需要使用的选项,在该参数值对象中可以使用flag属性指定对该文件采取什么操作,默认值为 ’r’。如果指定读取的文件不存在,则抛出异常。
在这里插入图片描述
向文件中追加内容
追加文件内容的异步函数语法如下所示。
fs.appendFile(file, data[, options], callback);
在这里插入图片描述
文件读取
在Node.js中,用于文件读取的异步函数语法如下所示。
fs.readFile(file[, options], callback);
在这里插入图片描述
在操作文件的过程中,有时需要将一个文件中的内容读取出来,写入到另一个文件中,这个过程就是文件复制的过程。Node.js 中没有直接提供文件复制的函数,但是学习了文件写入和文件读取我们可以自己写代码来完成这个过程。
var fs = require(‘fs’);
//读取a.txt文件数据
fs.readFile(‘E:/a.txt’, function(err, data) {
if (err) {
return console.log(‘读取文件失败了’);
}
//将数据写入c.txt文件
fs.writeFile(‘E:/c.txt’, data.toString(), function(err) {
if (err) {
return console.log(‘写入文件失败了’);
}
});
console.log(‘文件复制成功了’);
});
获取文件信息
在Node.js中,用于获取文件信息的异步函数如下所示:
fs.stat(path, callback);
在这里插入图片描述
路径字符串操作(Path模块):
在文件操作过程中,经常会遇到路径拼接的问题,例如读取一个路径中的文件名部分,或者获取一个文件中的后缀名部分,把两个不完整的路径拼接成一个完整的路径Node.js的Path模块提供了一些用于路径操作的相关API,如下表所示。
在这里插入图片描述
Path为核心模块,模块标识为“path”,所以在文件中加载该模块可以使用如下语句。
var path = require(‘path’);
在Node.js中,除了可以对文件内容进行操作,也可以对文件目录进行增加、读取、和删除等操作。
Node.js中用于创建目录的异步函数语法格式如下所示。
在这里插入图片描述
Node.js中用于删除目录的异步函数语法格式如下所示。
fs.rmdir(path, callback);
在上述语法中, path为文件路径;callback 为回调函数,该函数带有两个参数err和files,err 为错误信息,files 为 目录下的文件数组列表。
删除目录和删除文件:
Node.js中用于读取目录的异步函数语法格式如下所示。
fs.readdir(path, callback);
删除目录时有一个要求,就是该目录必须为空,所有删除目录的操作还需要读取目录和删除文件操作进行支持。Node.js中用于删除文件的异步函数语法格式如下所示。fs.unlink(path, callback);
五、Nodejs中处理数据 IO
Buffer缓冲区
Buffer 类是随 Node.js 内核一起发布的核心库,用于支持I/O操作中移动的数据处理,Buffer 库内存中创建一个专门存放二进制数据的缓冲区,这样就Node.js能够处理二进制数据了。
二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数据
由于计算机只能识别二进制数据,而我们人类很难看懂“1010”代表什么,因此,需要将二进制数据转换为我们能够方便识别的字符,这时就需要设置字符编码,通过字符编码找到相应的字符集进行“翻译”,这个字符集就像一本字典, Window系统最原始的的字符编码就是ASCII,它支持英文中常用的字母、数字和标点符号等与二进制数据之间的转换。
二进制数据和乱码有着密不可分的关系,乱码是指计算机二进制数据在转换字符的过程中,使用了不合适的字符集,而造成部分或所有字符无法被阅读,产生空白或者输出的一系列字符。 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,包含了简体和繁体的中文字符,能正确显示多种语言,所以在出现乱码时,我们一般建议使用UTF-8编码。
Buffer的构造函数:
var buf = new Buffer(size);
var buf = new Buffer([10, 20, 30, 40, 50]);
var buf = new Buffer(“hello”, “utf-8”);
写入缓冲区
在进行文件复制的过程中,首先要将源文件的数据读取出来,写入Buffer中。写入 Node.js缓冲区的语法如下所示。
buf.write(string[, offset[, length]][, encoding]);
在这里插入图片描述
从缓冲区读取数据
在进行文件复制时,源文件的数据写入缓冲区后,还需要从缓冲区中读取出来并且写入目标文件。读取 Node.js 缓冲区数据的语法如下所示:
buf.toString([encoding[, start[, end]]]);
在这里插入图片描述
在实际开发中,有时会遇到这样的需求,输出两个或多个缓冲区中内容的组合。为了解决这样的需求,Node .js中提供拼接缓冲区的函数,语法如下所示:
buf.concat(list[, totalLength]);
由于Buffer缓冲区限制在1GB,超过1GB的文件无法直接完成读写,并且,如果有些读写资源一直持续,并不停止,Node.js将无法继续其他工作。所以用Node.js处理大数据文件的读写时会出现问题。为此,Node.js提供了Stream文件流模块,用来解决大数据文件操作的问题。
我们知道Node.js的File System模块并没有提供一个copy的方法,但是通过读取文件和写入文件的方式可以实现,即把文件A的内容全部读入Buffer缓冲区,然后再从缓冲区读出写入文件B,该过程的执行流程图如下图所示。
由于Buffer缓冲区限制在1GB,对于大文件的操作,理想的实现方式是“读一部分,写一部分”,流程如下图所示。
Node.js的可读流
使用文件流进行文件复制,首先需要把文件流中的数据读取出来,而这个读取过程需要我们创建一个可读流,可读流可以让我们在源文件中分块读取文件中的数据,在Node.js中,创建可读流的语法如下所示。
fs.createReadStream(path[, options]);
在这里插入图片描述
在Node.js中,文件流的操作由Stream模块提供,Stream有四种流类型:
Readable - 可读操作。
Writable - 可写操作。
Duplex - 可读可写操作.
Transform - 操作被写入数据,然后读出结果。
所有的 Stream 对象都是 EventEmitter(时间触发器) 的实例。常用的事件如下所示。
在这里插入图片描述
可写流让我们可以写数据到目的地,像可读流一样,它也是基于EventEmitter。在Node.js中,创建可读流的语法如下所示。
fs.createWriteStream(path[, options]);
在这里插入图片描述
在可读流中还有一个函数叫做pipe(),这个函数是一个很高效的文件处理方式,可以简化之前复制文件的操作,pipe翻译成中文是管子的意思,使用pipe()进行文件复制相当于把盆换成管子,通过管子来完成数据的读取和写入。
六、Node.js网络编程
网络编程就是在两个或两个以上的设备(例如计算机、手机、服务器、智能电视等等)之间传输数据,也叫做网络通信。
IP地址和端口号
通过浏览器可以向服务器端发送数据,那么客户端就需要通过找到对应的服务器设备,并且找到该服务器设备上对应的服务器软件进行处理,这个过程就需要IP地址和端口号进行支持,如图所示。
TCP/IP协议是TCP和IP协议的合称,TCP(Transfer Control Protocol) 传输控制协议方式,是一种稳定可靠的传送方式,TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给互联网的每一台联网设备规定一个地址。
Socket的英文原义是“孔”或“插座”。在程序方面,我们理解为接口对象,在网络编程中通常也称作“套接字”,用于描述IP地址和端口。Socket如图所示。
一个完整的Socket包含了进行网络通信必须的五种信息:
连接使用的协议
客户端设备的IP地址
客户端的端口
服务端的IP地址
服务器端口
Node.js的套接字服务由Net模块提供,其中包含了创建服务器/客户端的方法,引入该模块的语法如下所示。
var net = require(‘net’);
在这里插入图片描述
在Node.js中,使用net模块可以创建一个 TCP 或本地服务器
var server = net.createServer([options][, connectionListener]);
在这里插入图片描述
当Server对象被创建后,在该服务器的生命周期中就存在了一些可触发的事件
在这里插入图片描述
Net.Socket对象
在Node.js中提供了一个Net.Socket对象,用于方便调用底层Socket接口,实现数据传输的功能。该对象在客户端和服务端同时被创建,创建成功后便可以触发相关事件
在这里插入图片描述
Net.Socket对象中用于获取信息的属性如下表所示。
在这里插入图片描述
Net.Socket对象是一个可读可写流,提供了一些函数用来执行读取和写入等操作,常用函数如下表所示。
在这里插入图片描述
Net.Socket对象-客户端服务器双向通信
在Net模块中可以通过一些函数创建客户端,常用语法如下所示。
net.createConnection(options[, connectListener]);
进程可以看做是一个正在运行的应用程序,例如在前面小节的案例中使用的客户端和服务器,在运行时多可以叫做一个进程,Node.js的应用是在单个线程运行的,但是现在大部分服务器都是多处理器,为了方便所以使用多个进程。
在Node.js中提供了Process模块用来管理进程,Process模块是一个无须使用require()就可以从Node.js应用程序进行访问的全局对象。
Process模块获取终端输入
在Node.js中可以通过如下方式来获取进程中输入的数据,也就是终端的输入数据。
process.stdin.on(‘data’,function (data) {
console.log(data.toString().trim());
});
多人广播消息就是在一个客户端输入信息时,除了自己以为的其他客户端都能到,这时就需要在服务器端获取该客户端输入的数据,然后将其他送到其他客户端,接下来通过一个案例进行演示。
七、Node.js中实现HTTP服务
简单的说,HTTP协议就是用于规范客户端浏览器和服务器端以什么样的格式进行通信数据交互,作为应用层的面向对象的协议,HTTP由请求和响应构成,是一个标准的客户端服务器模型,也是一个无状态的协议。
浏览器向服务器发送的URL地址中并没有出现IP地址,那么发送请求时怎样找到对应的服务器?
一个URL由几个不同的部分组成,每个部分都会为Web服务器如何处理来自客户端的HTTP请求提供一块基本的信息,一个URL的基本结构如图所示。
HTTP协议的主要特点可概括如下:
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP请求响应流程:
如果URL中使用的是域名,而客户端向服务端通信必须获取服务端的IP地址,这时在客户端和服务器之间就需要一个代理服务器(DNS),DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器,转换过程如图所示。
HTTP协议中信息的格式以报文的形式呈现,报文就是有一定格式的字符串,只是这里的格式需要遵守HTTP协议规范,报文分为两种:请求报文,响应报文
在发送请求时,浏览器将用户输入的URL地址按照HTTP协议的格式封装成了HTTP请求报文,存放在客户端的Socket对象中,服务器从Socket对象中获取报文,并且使用HTTP协议规定的方式进行解析,例如客户端需要访问一个页面,服务器会在解析后将页面需要的数据响应给客户端。
在做出响应时,也会将数据封装在HTTP响应报文中,并存放在服务端的Socket对象中,这时客户端从Socket对象中获取响应报文,将响应数据解析成自己可以识别的字符,例如返回数据是HTML页面,那就么渲染HTML和CSS,解析和执行JavaScript代码等。
请求报文:请求行(request line),请求消息头(headers),空行(blank line),请求体(request body)
请求行位于请求消息第一行,包括三个部分,分别是请求方式、资源路径以及所使用的HTTP协议版本,以空格进行划分。
Http协议中常用的请求方式主要是GET和POST:
1、GET:当用户在浏览器地址栏中直接输入某个URL地址或者单击网页上一个超链接时,浏览器将默认使用GET方式发送请求。例如:
GET /javaForum?name=lee&psd=hnxy HTTP/1.1
2、POST:如果将网页上的form表单的method属性设置为“POST”,那么就会以POST方式发送请求。例如:
POST /javaForum HTTP/1.1
Host: www.itcast.cn
Content-Type: application/x-www-form-urlencoded
Content-Length: 17
name=lee&psd=hnxy
请求消息头,由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型;
Accept:客户端可识别的响应内容类型列表;星号 “ * ” 用于按范围将类型分组,用 “ / ” 指示可接受全部类型,用“ type/* ”指示可接受 type 类型的所有子类型;
Accept-Language:客户端可接受的自然语言;
Accept-Encoding:客户端可接受的编码压缩格式;
Accept-Charset:可接受的应答的字符集;
Host:请求的主机名,允许多个域名同处一个IP 地址,即虚拟主机;
connection:连接方式(close 或 keepalive);
Cookie:存储于客户端扩展字段,向同一域名的服务端发送属于该域的cookie;
请求体的内容就是请求数据,请求数据不在 GET 方法中使用,而是在POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求体相关的最常使用的是包体类型 Content-Type 和包体长度 Content-Length;
一个HTTP响应报文由4部分组成
状态行(status line),响应消息头(Headers),空行(blank line),响应体(response body)
在HTTP响应消息中,第1行为响应状态行,它包括三个部分,分别是HTTP协议版本、一个表示成功或错误的整数代码(状态码)和对状态码进行描述的文本信息,以空格进行划分。
状态代码由3位数字组成,表示请求是否被理解或被满足。HTTP响应状态码的第一个数字定义了响应的类别,后面两位没有具体的分类,第一个数字有五种可能的取值,具体介绍如下所示:
1xx:表示请求已接收,需要继续处理
2xx:表示请求已成功被服务器接收、理解、并接受
3xx:为完成请求,客户端需进一步细化请求
4xx:客户端的请求有错误
5xx:服务器端出现错误
HTTP的请求报文和响应报文
状态行后紧接着的是若干响应消息头,服务器端通过响应消息头向客户端传递附加信息,包括服务程序名、被请求资源需要的认证方式、客户端请求资源的最后修改时间、重定向地址等信息。
响应体的内容就是响应数据,包括服务器返回给客户端的文本信息。

Node.js 提供了HTTP模块,HTTP模块主要用于搭建 HTTP 服务端和客户端,HTTP模块为核心模块,可以使用“var http = require(‘http’);”进行加载。HTTP服务器的本质上也是一个Socket服务器,可以理解为在Socket服务器的基础上进行了一些封装,简化了一些操作
HTTP模块常用API-http.Server:
在Node.js中,HTTP服务器是指http.Server对象,用 Node.js 做的所有基于 HTTP 协议的系统,如网站、社交应用甚至代理服务器,都是基于 http.Server 实现的。创建http.Server对象的语法如下所示。
var server = http.createServer();
使用creatServer()函数创建的server对象就是一个http.Server对象。
http.Server是一个基于事件的 HTTP 服务器,继承自EventEmitter,所有的请求都被封装为独立的事件,开发者只需要对它的事件编写相应函数即可实现 HTTP 服务器的所有功能。http.Server提供了一些函数,具体如下所示。
server.close([callback]):服务器停止已经开始的监听
server.listen(port[, hostname][, backlog][, callback]);
port:指定监听的端口
hostname:指定主机名
backlog:指定被允许进行排队的最大待处理连接数。默认是511。
callback:指定改服务器已经开始在指定的端口上监听时,要执行的回调处理函数
server.listen(handle[, callback])和server.listen(path[, callback]):监听文件系统的连接。第一个是监听已打开文件描述句柄,第二个是要监听一个文件的路径。
http.Server还提供了3个事件,具体如下。
request:当客户端请求到来时,该事件被触发,提供两个参数 req 和res,分别http.ServerRequest 和 http.ServerResponse 的实例,表示请求和响应信息。
connection:当 TCP 连接建立时,该事件被触发,提供一个参数 socket,为net.Socket 的实例。connection 事件的粒度要大于 request,因为客户端在Keep-Alive 模式下可能会在同一个连接内发送多次请求。
close :当服务器关闭时,该事件被触发。注意不是在用户连接断开时。除此之外还有 checkContinue、upgrade、clientError 事件,通常我们不需要关心,只有在实现复杂的 HTTP 服务器的时候才会用到。
在HTTP服务器和客户端都会创建http.IncomingMessage对象,它一般由http.Server 的 request 事件发送,作为第一个参数传递,通常简称 request 或 req。
http.IncomingMessage对象中还提供了一些函数和属性,用来获取客户端请求和服务端响应的一些信息。
在这里插入图片描述
http.ServerResponse 是返回给客户端的信息,决定了用户最终能看到的结果。它也是由 http.Server 的 request 事件发送的,作为第二个参数传递,一般简称为response 或 res。http.ServerResponse是一个可写流,用来给客户端的Socket发送响应报文,在服务器做出响应之前会发送响应报文。
http.ServerResponse中有三个重要的成员函数,具体如下。
response.writeHead(statusCode, [headers]):向请求的客户端发送响应头。statusCode 是 HTTP 状态码,如 200 (请求成功)、404 (未找到)等。headers是一个类似关联数组的对象,表示响应头的每个属性。该函数在一个请求内最多只能调用一次,如果不调用,则会自动生成一个响应头。
response.write(data, [encoding]):向请求的客户端发送响应内容。data 是一个 Buffer 或字符串,表示要发送的内容。如果 data 是字符串,那么需要指定encoding 来说明它的编码方式,默认是 utf-8。在 response.end 调用之前,response.write 可以被多次调用。
response.end([data], [encoding]):结束响应,告知客户端所有发送已经完成。当要所有返回的内容发送完毕的时候,该函数 必须 被调用一次。它接受两个可选参数,意义和 response.write 相同。如果不调用该函数,客户端将永远处于等待状态。
HTTP模块常用API-http.ServerResponse
在这里插入图片描述
在实际应用中,我们经常通过单击不同的链接进入不同的页面,例如在某个网站上,单击“登录”,会跳转到登录页面,这样的需求常常需要在服务器端进行请求处理来完成

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值