JS在线运行

版本:

所属目录
点击了解高性能代码运行API
运行结果
教程手册
代码仓库
极速运行
终端运行
图形+终端

                        
以下是用户最新保存的代码
找出重复代码】(二维动态规划:定义二维数组dp,初始值设为0,循环两个字符串,如果str1[i]=str2[j],dp[i+1][j+1]==dp[i][j]+1;使用maxLength定义当前最大的公共子串长度,如果dp[i+1][j+1]>maxLength,记录maxLength和当前结束位置i+1。循环后,根据maxLength和结束位置p,确定silce的范围 发布于:2025-04-01 19:24 【二叉树中序遍历】(用栈将二叉树的结构处理出来。然后中序遍历) 发布于:2025-04-01 19:08 【最小调整顺序次数】(模拟队列操作:当插入操作为头操作时,如果数组不为空,就不是排序状态。尾插入不影响;当移除元素时,如果当前队列是有序的 ,就不需要操作,否则就需要操作,ans++) 发布于:2025-04-01 18:29 二元组个数】(用map存储第一个数组中出现的元素及个数,然后遍历第二个数组,如果遇到map中的元素,ans+=map.get()) 发布于:2025-04-01 18:02 【文件目录大小】(递归:先读取每个文件的信息,解析每行输入的三个部分:id,size,child并将处理过后的放入files中,files:{id,size,child}。然后递归计算目标目录的大小:自定义一个递归函数 getSize,将目标目录设为root节点,向下递归子文件夹,如果有子文件夹就递归计算所有子节点的大小并累加,最后返回结果) 发布于:2025-04-01 17:49 华为OD机试真题 Python 实现【水库蓄水问题】(变体接雨水问题,用双指针遍历数组,然后将子数组内的每一个数字能接到的雨水相加(如果当前位置数字 小于左右边界的最小值,能够接水),如果有多个位置接的雨水相同,保留right-left最小的) 发布于:2025-04-01 17:23 找出两个整数数组中同时出现的整数】(用map存储第一个数组中的元素,然后再循环第二个数组,当遇到map中有的数字时,记录下这个数字。再创建新的Map,按出现次数分组存储数字// 获取当前数字及其在第一个数组中的出现次数// 将数字添加到对应次数的组中,并保持组内数字有序;// 获取所有出现次数并按升序排序// 按格式输出结果) 发布于:2025-04-01 16:47 模拟消息队列(两个数组,一个用来存消息,一个用来存接受者,接受者的中包括订阅时间取消时间和能接收到的消息,正序循环message数组,在逆序循环接受者数组,每当有发送消息的时间在订阅和取关之间时,把这个消息放到消息队列中) 发布于:2025-04-01 16:22 【投篮大赛】(简单字符串操作) 发布于:2025-04-01 16:05 【数值同化】(广度优先搜索,搜索能够到达的所有格子,然后遍历矩阵找出无法到达的地区) 发布于:2025-04-01 15:29 数字加减游戏(数学问题:先判断目标-初始是否能被b整除,如果能直接输出0.如果不能就每次判断初始值+a*x或初始值-a*x是否能整除b,如果能,就时最优解) 发布于:2025-04-01 15:10 数组二叉树(// 遍历树中的所有节点,寻找最小的叶子节点 // 判断当前节点是否为叶子节点,需满足以下条件: // 1. 节点值不为 -1(不是空节点) // 2. 节点值小于当前找到的最小叶子值 // 3. 左子节点不存在(超出数组范围或为-1) // 4. 右子节点不存在(超出数组范围或为-1) // 更新最小叶子节点的索引和值,找到叶子节点后,根据叶子节点不断向上推导出父节点,直到找到根节点。对于索引i,其父节点索引为 floor((i-1)/2)) 发布于:2025-04-01 14:56 【招聘】计算至少需要的面试官数量( // 核心算法思路: // 1. 首先对所有面试时间区间按开始时间排序 // 2. 检查相邻区间是否存在时间重叠 // 3. 对于重叠的区间,需要额外的面试官 // 4. 最后根据重叠情况和每个面试官的面试次数限制(m)计算所需面试官总数) 发布于:2025-03-31 18:44 查找一个有向网络的头节点和尾节点(读取输入数据并解析 统计每个节点的入度和出度 使用Map存储节点的入度和出度 每处理一条边,同时更新起点和终点的度数 入度为0的节点是起点 出度为0的节点是终点 终点需要降序排序 检查是否存在起点和终点 收集所有起点和终点 对终点进行排序 输出结果) 发布于:2025-03-31 17:51 数字序列比大小(田忌赛马:首先对两个数组进行升序排序 对arrA中的每个元素: 在arrB中查找第一个大于等于它的元素 如果找到,使用该位置的前一个元素进行匹配(得1分) 如果找不到,使用arrB的最后一个元素(得-1分)) 发布于:2025-03-31 17:20 寻找最大价值的矿堆(BFS函数实现: 参数:起始位置(i,j) 功能: 计算从起始位置开始的连通区域的和 使用BFS遍历所有相邻的位置 将已访问的位置标记为0 返回连通区域的和 主要流程: 读取矩阵数据 遍历矩阵的每个位置 对未访问的位置进行BFS 更新最大连通区域的和 关键点: 使用0标记已访问的位置 只处理值大于0的位置 考虑四个方向的相邻位置 使用Math.max更新最大和) 发布于:2025-03-31 16:53 仿LISP运算(遍历输入字符串的每个字符,遇到右括号或空格时,处理已收集的字符 遇到右括号时,进行运算,收集非括号和空格的字符;运算时从栈中弹出两个操作数和一个运算符,根据运算符执行相应的运算,将运算结果压入栈中,处理除数为0的特殊情况) 发布于:2025-03-31 16:35 Wonderland(使用dp数组记录到每天为止的最小花费 dp[i]表示到第i天为止的最小花费 // 初始值都设为0 // 状态转移: // 对于每个需要出行的日期: // 计算四种购买方案的花费 // 选择花费最小的方案 // 对于不需要出行的日期: // 保持前一天的花费不变 // 购买方案: // 买1天通行证:dp[i-1] + costs[0] // 买3天通行证:dp[i-3] + costs[1](如果天数足够) // 买7天通行证:dp[i-7] + costs[2](如果天数足够) // 买30天通行证:dp[i-30] + costs[3](如果天数足够) // 结果输出: // 输出最后一天的最小花费) 发布于:2025-03-31 16:11 【书籍叠放】(最大连续递增子序列:动态规划,先将原数组按降序(或升序)排列,然后定义dp数组,初始值为1(当前数组就是最大),双循环数组,每当arr[j][1]>arr[i][1]时,判断当前dp[i]与dp[j]+1的大小,取最大值。最后输出dp数组的最大值) 发布于:2025-03-31 15:59 最优资源分配(找每个资源中0的位置,简单题) 发布于:2025-03-31 15:49 寻找最优的路测线路(bfs:bfs时对四个方向分别进行计算,每一次都采用最大的值,当dx,dy==row-1,tate-1时,停止bfs搜索。将搜索结果放置在数组中,找到数组中的最小值) 发布于:2025-03-28 18:53 【运输时间】(逻辑分析:因为不能超车,所以最后一辆车到达的时间一定是最慢的,用arrived计算所有车辆到达的最大值(每辆车到达的最大值curArrive = n/speed+(i) i是发车的顺序 ),花费的路程只需要用arrived-发车时间(m-1)即可) 发布于:2025-03-28 18:05 战场索敌】(bfs算法:使用visited代表矩阵的每一个下标是否被访问过。循环矩阵,当遇到未被访问且不为‘#’的元素时,进入dfs算法;计算区域内E的数量是否<k如果<k,ans++;) 发布于:2025-03-28 17:52 最佳植树距离 发布于:2025-03-28 17:17 编码能力提升计划(二分+动态规划:二分的左边界是0:每天都看答案;又边界是question.sum-Math.max(...questions),check算法中,let days = 1; // 当前天数,从第1天开始 let i = 0; // 当前处理的题目索引 let maxCost = 0; // 当前天耗时最多的题目 let sum = 0; // 当前天的做题时间总和 let canWatch = true; // 当前天是否可以看答案;sum++;如果sum>T,则看答案:将储存的最大的值-去,然后再进行下一项的比对;如果不能看答案,直接到下一天,将sum,maxCost,canWatch都重置。最后返回days<=m) 发布于:2025-03-28 16:47 推荐多样性(逻辑分析:循环为windows输入元素:对每个输入数组进行取值操作,每次取n个值,然后将这n个元素分别放入到每一个window中,用idx控制输入元素个数,如果idx==n*k,立即停止循环。当list数组内的元素个数小于n时,需要像下一行借元素。然后再将这些元素都插入到window中,最后输出时将所有的window数组都拼成一个) 发布于:2025-03-28 15:43 ## JSTest 发布于:2025-03-28 09:07 【篮球游戏】(双端队列:用一个队列记录数据;定义idx变量代表outpusArr中对应的数组元素。循环inputArr,每次的数据入队,入队后,判断队列的最左边元素与最右边元素是否为当前输出数组的outputs[idx],如果是,queue退出对应元素,idx指向outputArr的下一个元素;如果左右都不匹配,说明不能得出这个序列,推出循环。判断res长度是否与输入长度相等。如果相等,说明是正确答案,输出res,如果不是,说明无解) 发布于:2025-03-27 19:11 宜居星球改造计划(不顶行输入及多源bfs算法:先while循环把matrix输入获取出来,然后遍历一次matrix,找到need数量(No的值),。然后将yes的坐标入栈,初始为第一层。按层判断四个方向是否为NO,如果为NO,就入队。每层结束后,如果need>0,day++;当所有循环结束后,如果need不为0,则输出-1;否则输出day) 发布于:2025-03-27 18:55 【解压报文】(定义四个栈:strStack:用来存储输入中的字母;numStack:用来存储计算过的数字(就是循环次数);repeatNumStack:用来临时存放读取到的数字;idxStack:用来存放重复拼接字符串时,strStack中的开始位置。读取字符串str的每一个元素,当遇到字母时,压入strStack;当读取到‘[’时,说明前面的循环次数num已经读取完毕,把repeatNum中的所有元素组成一个数字压入numStack中,清空repeatNum;然后记录当前字符串栈的长度到idxStack,这个长度就是后面遇到第一个']'时要重复元素在str中的起始位置。当遇到']'时,直接读取idx.pop(),numStack.pop()组成一个新的字符串,重新压回strStack。最后循环结束后输出strstack) 发布于:2025-03-27 18:01 【加密算法】(dfs+回溯:循环二维数组,当找到明文的第一个数组时,使用dfs算法,dfs对四个方向(上、左、右、下)开始递归寻找,如果找到就返回true,找不到就回溯,将visited[i][j]重置为false并将path中的下标组移除。最后path中的结果就是答案) 发布于:2025-03-27 17:24 打印任务排序(先将所有任务都放入一个集合中,集合的key为原数组下标,val为一个数组,初始元素为element本身;定义一个变量i然后循环直至数组长度为0:每次都出第一个元素,比较后面是否有比他大的元素,如果没有就将i放到集合中找到的这个数的第一个元素的值中去,否则就将这个数放到arr的队尾。循环结束后,将集合中的每一个vals中的第二个元素都打印出来,就是结果) 发布于:2025-03-27 16:51 观看文艺汇演问题(动态规划:先把每一场表演的开始时间和结束时间算出来放到一个数组中,然后按照开始时间排序,开始时间相同则按照结束时间升序。维护一个dp数组,dp[i]表示到第i场位置最多能参加多少场,循环两次数组,第一层从1-n,第二层从0-i,如果直播j结束后有足够时间(15分钟)赶到直播i,则可以考虑参加直播i,更新dp[i]为当前最大值) 发布于:2025-03-27 15:23 【走梅花桩】(dfs:用一个visited二维数组判断数组是否使用过,避免重复操作;dfs中对offsets的每一个[x+offsetX,y+offsetY]进行判断,如果再x+offsetX,y+offsetY不越界的情况下,ymatrix[x][y]-matrix[x+offsetX][y+offsetY]<=x&&visited[x+offsetX,y+offsetY]不为true,则count= dfs(x+offsetX,y+offsetY,count+1),直到递归结束。然后对二维数组的每一个值进行dfs操作,找到最大值) 发布于:2025-03-27 14:57 九宫格按键输入(用map保存字母模式下的输入顺序,用栈保存字母模式下输入的相同数字,然后对输入字符串进行逻辑判断:如果是#,当前为字母模式时,需要清空栈并输出一个字母,然后切换模式;当输入的是数字时,如果是字母模式,,如果遇到和栈顶不同的数字或/,就清空栈,然后输出一个字母。否则就需要将这个数字压入栈。再输入元素的结尾放一个空格,增加一个else输出逻辑,确保最后一定能清空栈顶元素并输出字母) 发布于:2025-03-26 18:58 【最大值】(自定义排序,如果看a b组成的数字,如果a+b大,a排在B前面。否则b排在a前面) 发布于:2025-03-26 17:57 计算疫情扩散时间(多源图的层序bfs:先初始化矩阵,将矩阵内1的下标入队。然后bfs,bfs时,先遍历当前队列,对当前队列的每一组坐标,判断每一个偏移量处是否为未感染,如果未感染就感染;并将新的偏移坐标入队。循环过当前的size后,stime++。最后输出time) 发布于:2025-03-26 17:49 【火锅】吃到最多刚好合适的菜(把数组整合成第i秒能吃到这个菜,然后拿第一个菜,后面的菜用pre代表前一个菜拿的时间,如果suit[i]-pre>=m,可以拿,ans++) 发布于:2025-03-26 17:28 云短信平台优惠活动(完全背包问题) 发布于:2025-03-26 16:55 寻找符合要求的最长子串(滑动窗口:当右指针指向为数字时,r++,用letterNum记录子串内letter的数量,当letterNum>1时,开始收缩左窗口,直到letterNum==1;收缩完成后,更新最大值,然后重新开始滑动右指针) 发布于:2025-03-26 16:40 计算网络信号(先把arr转换成矩阵。再遍历矩阵,找到信号源,放入starts,然后对每一个starts都进行一遍bfs。bfs算法中,定义一个queue,将[x,y]作为初始bfs节点。每次都shift出节点每次向上下左右四个节点进行寻找。每次搜索matrix[newX][newY]--;如果这个值大于0,将[newX,newY]放入到queue中。) 发布于:2025-03-26 16:16 最长方连续方波信号(先将输入的字符串截断,当连续出现两个0时就把第二个0之前的部分截断。内置临时变量i,当i等于字符串的长度的时候停止循环;然后再对每一个有效字符(长度大于1)的进行判断,将符合条件的提取出来,最后再按照长度排序) 发布于:2025-03-26 15:25 【学生方阵】(暴力破解,分别对周围8个方向进行查找) 发布于:2025-03-26 15:03 树状结构查询(用map模拟树结构,将每一个父亲节点都放到map.get中,然后对map进行dfs遍历) 发布于:2025-03-26 14:50 【数字游戏】(双循环暴力破解) 发布于:2025-03-26 14:32 字符串化繁为简(先对字符串进行预处理:将每一个()内的字母都放入一个集合中,然后把不在()内的字母单独放到一个str中;然后对每一个set进行合并操作:循环这个集合数组,每次进行两两比较,如果这两个集合中的任意一个字母或他对应的大写字母在另一个集合中也出现过,那么这两个集合就能够合并。将合并之后的新集合放到数组中并重新开始循环,直到循环两次后没有任何数组能够合并。集合合并过后就对原字符串进行操作,对每一个字母在集合中进行比对,如果在任意一个集合中,就替换成这个集合中的那个字典排序最小的那个。))(暴力解法75%通过率) 发布于:2025-03-25 17:50 【找单词】(bfs:对matrix内的每个元素与word[k]进行比对,当比对结果正确时将(i,j)放入path中,将used[i,j]==true并对[i,j]四周[i-1,j][i+1,j][i,j-1][i,j+1]进行dfs。如果结果均为false,path弹出,used[i,j]还原为false;如果path的长度等于word的长度,说明找到了结果,直接return true。对矩阵中的每个元素都进行一次dfs,找到正确的值后直接return console.log(path.join(',')) 发布于:2025-03-25 16:40 文本统计分析(输入处理;转义字符处理;) 发布于:2025-03-25 15:43 模拟目录管理功能(用多叉树模拟文件管理) 发布于:2025-03-24 19:02 项目排期(二分+回溯) 发布于:2025-03-24 18:16 [更多]
显示目录

HTTP



学习嵌入式的绝佳套件,esp8266开源小电视成品,比自己去买开发板+屏幕还要便宜,省去了焊接不当搞坏的风险。 蜂鸣版+触控升级仅36元,更强的硬件、价格全网最低。

点击购买 固件广场

HTTP

稳定性: 3 - 稳定

如果要在Node.js中使用HTTP服务器或客户端功能,则必须调用require('http')

Node里的HTTP接口支持协议里原本比较难用的特性。特别是很大的或块编码的消息。这些接口不会完全缓存整个请求或响应,这样用户可以在请求或响应中使用数据流。

HTTP消息头对象和下面的例子类似:

{ 'content-length': '123',
  'content-type': 'text/plain',
  'connection': 'keep-alive',
  'host': 'mysite.com',
  'accept': '*/*' }

Keys都是小写,值不能修改。

为了能支持尽可能多的HTTP应用程序,Node提供的HTTP API接口都是底层的。仅能处理流和消息。它把消息解析成报文头和报文体,但是不解析实际的报文头和报文体内容。

定义报文头的时候,多个值间可用,分隔。除了set-cookiecookie头,因为它们表示值的数组。诸如content-length的只有一个值的报文头,直接解析,并且只有单值可以表示成已经解析好的对象。

接收到的原始头信息以数组([key, value, key2, value2, ...])的形式保存在rawHeaders里。例如,之前提到的消息对象会有如下的rawHeaders

[ 'ConTent-Length', '123456',
  'content-LENGTH', '123',
  'content-type', 'text/plain',
  'CONNECTION', 'keep-alive',
  'Host', 'mysite.com',
  'accepT', '*/*' ]

http.METHODS

  • {Array}

解析器支持的HTTP方法列表。

http.STATUS_CODES

  • {Object}

全部标准HTTP响应状态码的和描述的集合。例如,http.STATUS_CODES[404] === 'Not Found'

http.createServer([requestListener])

返回http.Server的新实例。

requestListener函数自动加到'request'事件里。

http.createClient([port][, host])

这个函数已经被抛弃,用http.request()替换。创建一个新的HTTP客户端,连接到服务器的porthost

类: http.Server

这是事件分发器EventEmitter,有以下事件:

事件: 'request'

function (request, response) { }

每当有请求的时候触发。注意:每个连接可以有多个请求(在keep-alive连接中)。requesthttp.IncomingMessage实例,responsehttp.ServerResponse 的实例。

事件: 'connection'

function (socket) { }

当建立新的TCP流的时候。socket是一个net.Socket对象。通常用户不会访问这个事件。协议解析器绑定套接字时采用的方式使套接字不会出发readable事件。也能通过request.connection访问socket

事件: 'close'

function () { }

服务器关闭的时候触发。

事件: 'checkContinue'

function (request, response) { }

当http收到100-continue的http请求时会触发。如果没有监听这个事件,服务器将会自动发送100 Continue的响应。

如果客户端需要继续发送请求主题,或者生成合适的HTTP响应(如,400请求无效),可以通过调用response.writeContinue()来处理。

注意:触发并处理这个事件的时候,不会再触发request事件。

事件: 'connect'

function (request, socket, head) { }

当客户端请求http连接时触发。如果没有监听这个事件,客户端请求连接的时候会被关闭。

  • request是http请求的参数,与request事件参数相同。
  • socket是服务器和客户端间的socket。
  • head是buffer的实例。网络隧道的第一个包,可能为空。

这个事件触发后,请求的socket不会有data事件监听器,也就是说你需要绑定一个监听器到data上,来处理在发送到服务器上的socket数据。

事件: 'upgrade'

function (request, socket, head) { }

当客户端请求http upgrage时候会触发。如果没有监听这个事件,客户端请求一个连接的时候会被关闭。

  • request是http请求的参数,与request事件参数相同。
  • socket是服务器和客户端间的socket。
  • head是buffer的实例。网络隧道的第一个包,可能为空。

这个事件触发后,请求的socket不会有data事件监听器,也就是说你需要绑定一个监听器到data上,来处理在发送到服务器上的socket数据。

事件: 'clientError'

function (exception, socket) { }

如果一个客户端连接触发了一个'error'事件,它就会转发到这里.

socket是导致错误的net.Socket对象。

server.listen(port[, hostname][, backlog][, callback])

在指定的的端口和主机名上开始接收连接。如果忽略主机名,服务器将会接收指向任意的IPv4地址(INADDR_ANY)。

监听一个unix socket,需要提供一个文件名而不是主机名和端口。

积压量backlog为等待连接队列的最大长度。实际的长度由你的操作系统的sysctl设置决定(比如linux上的tcp_max_syn_backlogsomaxconn)。默认参数值为 511 (不是512)

这是异步函数。最后一个参数callback会作为事件监听器添加到listening事件。参见net.Server.listen(port)

server.listen(path[, callback])

启动一个UNIX socket服务器所给路径path

这是异步函数。最后一个参数callback会作为事件监听器添加到listening事件。参见net.Server.listen(port)

server.listen(handle[, callback])

  • handle {Object}
  • callback {Function}

    handle 对象可以是server或socket(任意以下划线_handle开头的成员),或者{fd: <n>}对象。

这会导致server用参数handle接收连接,前提条件是文件描述符或句柄已经连接到端口或域socket。

Windows不能监听文件句柄。

这是异步函数。最后一个参数callback会作为事件监听器添加到listening事件。参见net.Server.listen(port)

server.close([callback])

用于禁止server接收连接。参见net.Server.close().

server.maxHeadersCount

最大请求头的数量限制,默认为1000。如果设置为0,则不做任何限制。

server.setTimeout(msecs, callback)

  • msecs{Number}
  • callback{Function}

为socket设置超时时间,单位为毫秒,如果发生超时,在server对象上触发'timeout'事件,参数为socket。

如果在Server对象上有一个'timeout'事件监听器,超时的时候,将会调用它,参数为socket。

默认情况下,Server的超时为2分钟,如果超时将会销毁socket。如果你给Server的超时事件设置了回调函数,那你就得负责处理socket超时。

server.timeout

  • {Number} Default = 120000 (2 minutes)

超时的时长,单位为毫秒。

注意,socket的超时逻辑在连接时设定,所以有新的连接时才能改变这个值。

设为0时,建立连接的自动超时将失效。

类: http.ServerResponse

这是一个由HTTP服务器(而不是用户)内部创建的对象。作为第二个参数传递给'request'事件。

该响应实现了Writable Stream接口。这是一个包含下列事件的EventEmitter

事件: 'close'

function () { }

在调用response.end(),或准备flush前,底层连接结束。

事件: 'finish'

function () { }

发送完响应触发。响应头和响应体最后一段数据被剥离给操作系统后,通过网络来传输时被触发。这并不代表客户端已经收到数据。

这个事件之后,响应对象不会再触发任何事件。

response.writeContinue()

发送HTTP/1.1 100 Continue消息给客户端,表示请求体可以发送。可以在服务器上查看'checkContinue'事件。

response.writeHead(statusCode[, statusMessage][, headers])

发送一个响应头给请求。状态码是3位数字,如404。最后一个参数headers是响应头。建议第二个参数设置为可以看的懂的消息。

例如:

var body = 'hello world';
response.writeHead(200, {
  'Content-Length': body.length,
  'Content-Type': 'text/plain' });

这个方法仅能在消息中调用一次,而且必须在response.end()前调用。

如果你在这之前调用response.write()response.end(),将会计算出不稳定的头。

Content-Length是字节数,而不是字符数。上面的例子'hello world'仅包含一个字节字符。如果body包含高级编码的字符,则Buffer.byteLength()就必须确定指定编码的字符数。Node不会检查Content-Length和body的长度是否相同。

response.setTimeout(msecs, callback)

  • msecs {Number}
  • callback {Function}

设置socket超时时间,单位为毫秒。如果提供了回调函数,将会在response对象的'timeout'事件上添加监听器。

如果没有给请求、响应、服务器添加'timeout'监视器,超时的时候将会销毁socket。如果你给请求、响应、服务器加了处理函数,就需要负责处理socket超时。

response.statusCode

使用默认的headers 时(没有显式的调用response.writeHead()),这个属性表示将要发送给客户端状态码。

例如:

response.statusCode = 404;

响应头发送给客户端的后,这个属性表示状态码已经发送。

response.statusMessage

使用默认headers时(没有显式的调用response.writeHead()),这个属性表示将要发送给客户端状态信息。如果这个没有定义,将会使用状态码的标准消息。

例如:

response.statusMessage = 'Not found';

当响应头发送给客户端的时候,这个属性表示状态消息已经发送。

response.setHeader(name, value)

设置默认头某个字段内容。如果这个头即将被发送,内容会被替换。如果你想设置更多的头, 就使用一个相同名字的字符串数组。

例如:

response.setHeader("Content-Type", "text/html");

response.setHeader("Set-Cookie", ["type=ninja", "language=javascript"]);

response.headersSent

Boolean(只读)。如果headers发送完毕,则为true,反之为false。

response.sendDate

默认值为true。若为true,当headers里没有Date值时,自动生成Date并发送。

只有在测试环境才能禁用,因为HTTP要求响应包含Date头.

response.getHeader(name)

读取一个在队列中但是还没有被发送至客户端的header。名字是大小写敏感的。仅能再头被flushed前调用。

例如:

var contentType = response.getHeader('content-type');

response.removeHeader(name)

从即将发送的队列里移除头。

例如:

response.removeHeader("Content-Encoding");

response.write(chunk[, encoding][, callback])

如果调用了这个方法,且还没有调用response.writeHead(),将会切换到默认的header,并更新这个header。

这个方法将发送响应体数据块。可能会多次调用这个方法,以提供body成功的部分内容。

chunk可以是字符串或 buffer。如果chunk 是字符串,第二个参数表明如何将它编码成字节流。encoding的默认值是'utf8'。最后一个参数在刷新这个数据块时调用。

注意:这个是原始的HTTP body,和高级的multi-part body编码无关。

第一次调用response.write()的时候,将会发送缓存的头信息和第一个body给客户端。第二次,将会调用response.write()。Node认为你将会独立发送流数据。这意味着,响应缓存在第一个数据块中。

如果成功的刷新全部数据到内核缓冲区,返回true 。如果部分或全部数据在用户内存中还处于排队状况,返回false。当缓存再次释放的时候,将会触发 'drain'

response.addTrailers(headers)

这个方法给响应添加HTTP的尾部header(消息末尾的header)。

只有数据块编码用于响应体时,才会触发Trailers;如果不是(例如,请求是HTTP/1.0),它们将会被自动丢弃。

如果你想触发trailers, HTTP会要求发送Trailer头,它包含一些信息,比如:

response.writeHead(200, { 'Content-Type': 'text/plain',
                          'Trailer': 'Content-MD5' });
response.write(fileData);
response.addTrailers({'Content-MD5': "7895bf4b8828b55ceaf47747b4bca667"});
response.end();

response.end([data][, encoding][, callback])

这个方法告诉服务器,所有的响应头和响应体已经发送;服务器可以认为消息结束。response.end()方法必须在每个响应中调用。

如果指定了参数data,将会在响应流结束的时候调用。

http.request(options[, callback])

Node维护每个服务器的连接来生成HTTP请求。这个函数让你可以发布请求。

参数options是对象或字符串。如果options是字符串,会通过url.parse()自动解析。

options值:

  • host: 请求的服务器域名或 IP 地址,默认:'localhost'
  • hostname: 用于支持url.parse()hostname优于host
  • port: 远程服务器端口。 默认为:80.
  • localAddress: 用于绑定网络连接的本地接口
  • socketPath: Unix域socket(使用host:port或socketPath)
  • method: 指定 HTTP 请求方法。 默认: 'GET'.
  • path: 请求路径。 默认为:'/'。如果有查询字符串,则需要包含。例如,'/index.html?page=12'。请求路径包含非法字符时抛出异常。目前,只有空格不行,不过在未来可能改变。
  • headers: 包含请求头的对象
  • auth: 用于计算认证头的基本认证,即user:password
  • agent: 控制Agent的行为。当使用了一个Agent的时候,请求将默认为Connection: keep-alive。可能的值为:
    • undefined (default): 在这个主机和端口上使用global Agent
    • Agent object: 在Agent中显式使用passed .
    • false: 选择性停用连接池,默认请求为:Connection: close.
    • keepAlive: {Boolean} 持资源池周围的socket,用于未来其它请求。默认值为false
    • keepAliveMsecs: {Integer} 使用HTTP KeepAlive的时候,通过正在保持活动的sockets发送TCP KeepAlive包的频繁程度。默认值为1000。仅当keepAlive为true时才相关。

可选参数callback将会作为一次性的监视器,添加给 'response' 事件。

http.request()返回一个http.ClientRequest类的实例。ClientRequest实例是一个可写流对象。如果需要用POST请求上传一个文件的话,就将其写入到ClientRequest对象。

例如:

var postData = querystring.stringify({
  'msg' : 'Hello World!'
});

var options = {
  hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': postData.length
  }
};

var req = http.request(options, function(res) {
  console.log('STATUS: ' + res.statusCode);
  console.log('HEADERS: ' + JSON.stringify(res.headers));
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
    console.log('BODY: ' + chunk);
  });
});

req.on('error', function(e) {
  console.log('problem with request: ' + e.message);
});

// write data to request body
req.write(postData);
req.end();

注意,例子里调用了req.end()http.request()必须调用req.end()来表明请求已经完成,即使没有数据写入到请求body里。

如果在请求的时候遇到错误(DNS解析、TCP级别的错误或实际HTTP解析错误),在返回的请求对象时会触发一个'error'事件。

有一些特殊的头需要注意:

  • 发送Connection: keep-alive告诉服务器保持连接,直到下一个请求到来。

  • 发送Content-length头将会禁用chunked编码。

  • 发送一个Expect头,会立即发送请求头,一般来说,发送Expect: 100-continue,你必须设置超时,并监听continue事件。更多细节参见RFC2616 Section 8.2.3。

  • 发送一个授权头,将会使用auth参数重写,来计算基本的授权。

http.get(options[, callback])

因为多数请求是没有报文体的GET请求,Node提供了这个简便的方法。和http.request()唯一不同点在于,这个方法自动设置GET,并自动调用req.end()

例如:

http.get("http://www.google.com/index.html", function(res) {
  console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
  console.log("Got error: " + e.message);
});

类: http.Agent

HTTP Agent用于socket池,用于HTTP客户端请求。

HTTP Agent也把客户端请求默认为使用Connection:keep-alive 。如果没有HTTP请求正在等着成为空闲socket的话,那么socket将关闭。这意味着,Node的资源池在负载的情况下对keep-alive有利,但是仍然不需要开发人员使用KeepAlive来手动关闭HTTP客户端。

如果你选择使用HTTP KeepAlive, 可以创建一个Agent对象,将 flag 设置为true. (参见下面的constructor options ) ,这样Agent会把没用到的socket放到池里,以便将来使用。他们会被显式的标志,让Node不运行。但是,当不再使用它的时候,需要显式的调用destroy(),这样socket将会被关闭。

当socket事件触发close事件或特殊的agentRemove事件时,socket将会从agent池里移除。如果你要保持HTTP请求保持长时间打开,并且不希望他们在池里,可以参考以下代码:

http.get(options, function(res) {
  // Do stuff
}).on("socket", function (socket) {
  socket.emit("agentRemove");
});

另外,你可以使用agent:false让资源池停用:

http.get({
  hostname: 'localhost',
  port: 80,
  path: '/',
  agent: false  // create a new agent just for this one request
}, function (res) {
  // Do stuff with response
})

new Agent([options])

  • options {Object} agent上的设置选项集合,有以下字段内容:
    • keepAlive {Boolean} 持资源池周围的socket,用于未来其它请求。默认值为false
    • keepAliveMsecs {Integer} 使用HTTP KeepAlive的时候,通过正在保持活动的sockets发送TCP KeepAlive包的频繁程度。默认值为1000。仅当 keepAlive为true时才相关。
    • maxSockets {Number}在空闲状态下,还依然开启的socket的最大值。仅当keepAlive设置为true的时候有效。默认值为256。

http.request使用的默认的http.globalAgent,会设置全部的值为默认。

必须在创建你自己的Agent对象后,才能配置这些值。

var http = require('http');
var keepAliveAgent = new http.Agent({ keepAlive: true });
options.agent = keepAliveAgent;
http.request(options, onResponseCallback);

agent.maxSockets

默认值为Infinity。决定了每台主机上的agent可以拥有的并发socket的打开数量,主机可以是host:porthost:port:localAddress

agent.maxFreeSockets

默认值256.对于支持HTTP KeepAlive的Agent而言,这个方法设置了空闲状态下仍然打开的套接字数的最大值。

agent.sockets

这个对象包含了当前Agent使用中的socket数组。不要修改它。

agent.freeSockets

使用HTTP KeepAlive的时候,这个对象包含等待当前Agent使用的socket数组。不要修改它。

agent.requests

这个对象包含了还没分配给socket的请求数组。不要修改它。

agent.destroy()

销毁任意一个被agent使用的socket。

通常情况下不要这么做。如果你正在使用一个允许KeepAlive的agent,当你知道不在使用它的时候,最好关闭agent。否则,socket会一直保存打开状态,直到服务器关闭。

agent.getName(options)

获取一组请求选项的唯一名,来确定某个连接是否可重用。在http agent里,它会返回host:port:localAddress。在http agent里, name包括CA,cert, ciphers, 和其他HTTPS/TLS特殊选项来决定socket是否可以重用。

http.globalAgent

Agent的全局实例,是http客户端的默认请求。

类:http.ClientRequest

该对象在内部创建并从http.request()返回。他是正在处理的请求,其头部已经在队列中。使用setHeader(name, value),getHeader(name), removeHeader(name)API可以改变header。当关闭连接的时候,header将会和第一个数据块一起发送。

为了获取响应,可以给请求对象的'response'添加监听器。当接收到响应头的时候将会从请求对象里触发'response''response'事件执行时有一个参数,该参数为http.IncomingMessage的实例。

'response'事件期间,可以给响应对象添加监视器,监听'data'事件。

如果没有添加'response'处理函数,响应将被完全忽略。如果你添加了'response'事件处理函数,那你必须消费掉从响应对象获取的数据,可以在 'readable'事件里调用response.read(),或者添加一个'data'处理函数,或者调用.resume()方法。如果未读取数据,它将会消耗内存,最终产生 process out of memory错误。

Node不会检查Content-Length和body的长度是否相同。

该请求实现了Writable Stream接口。这是一个包含下列事件的EventEmitter

事件: 'response'

function (response) { }

当接收到请求的时候会触发,仅会触发一次。response的参数是http.IncomingMessage的实例。

Options:

  • host: 要请求的服务器域名或IP地址
  • port: 远程服务器的端口
  • socketPath: Unix域Socket (使用host:port或socketPath之一)

事件: 'socket'

function (socket) { }

Socket附加到这个请求的时候触发。

事件: 'connect'

function (response, socket, head) { }

每次服务器使用CONNECT方法响应一个请求时触发。如果这个这个事件未被监听,接收CONNECT方法的客户端将关闭他们的连接。

下面的例子展示了一对匹配的客户端/服务器如何监听connect事件。var http = require('http');var net = require('net');var url = require('url');

// Create an HTTP tunneling proxy
var proxy = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('okay');
});
proxy.on('connect', function(req, cltSocket, head) {
  // connect to an origin server
  var srvUrl = url.parse('http://' + req.url);
  var srvSocket = net.connect(srvUrl.port, srvUrl.hostname, function() {
    cltSocket.write('HTTP/1.1 200 Connection Established\r\n' +
                    'Proxy-agent: Node-Proxy\r\n' +
                    '\r\n');
    srvSocket.write(head);
    srvSocket.pipe(cltSocket);
    cltSocket.pipe(srvSocket);
  });
});

// now that proxy is running
proxy.listen(1337, '127.0.0.1', function() {

  // make a request to a tunneling proxy
  var options = {
    port: 1337,
    hostname: '127.0.0.1',
    method: 'CONNECT',
    path: 'www.google.com:80'
  };

  var req = http.request(options);
  req.end();

  req.on('connect', function(res, socket, head) {
    console.log('got connected!');

    // make a request over an HTTP tunnel
    socket.write('GET / HTTP/1.1\r\n' +
                 'Host: www.google.com:80\r\n' +
                 'Connection: close\r\n' +
                 '\r\n');
    socket.on('data', function(chunk) {
      console.log(chunk.toString());
    });
    socket.on('end', function() {
      proxy.close();
    });
  });
});

事件: 'upgrade'

function (response, socket, head) { }

每当服务器响应upgrade请求时触发。如果没有监听这个事件,客户端会收到upgrade头后关闭连接。

下面的例子展示了一对匹配的客户端/服务器如何监听upgrade事件。

var http = require('http');

// Create an HTTP server
var srv = http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('okay');
});
srv.on('upgrade', function(req, socket, head) {
  socket.write('HTTP/1.1 101 Web Socket Protocol Handshake\r\n' +
               'Upgrade: WebSocket\r\n' +
               'Connection: Upgrade\r\n' +
               '\r\n');

  socket.pipe(socket); // echo back
});

// now that server is running
srv.listen(1337, '127.0.0.1', function() {

  // make a request
  var options = {
    port: 1337,
    hostname: '127.0.0.1',
    headers: {
      'Connection': 'Upgrade',
      'Upgrade': 'websocket'
    }
  };

  var req = http.request(options);
  req.end();

  req.on('upgrade', function(res, socket, upgradeHead) {
    console.log('got upgraded!');
    socket.end();
    process.exit(0);
  });
});

事件: 'continue'

function () { }

当服务器发送'100 Continue' HTTP响应的时候触发,通常因为请求包含'Expect: 100-continue'。该指令表示客户端应发送请求体。

request.flushHeaders()

刷新请求的头。

考虑效率因素,Node.js通常会缓存请求的头直到你调用request.end(),或写入请求的第一个数据块。然后,包装请求的头和数据到一个独立的TCP包里。

request.write(chunk[, encoding][, callback])

发送一个请求体的数据块。通过多次调用这个函数,用户能流式的发送请求给服务器,这种情况下,建议使用['Transfer-Encoding', 'chunked']头。

chunk参数必须是Buffer或字符串。

回调参数可选,当这个数据块被刷新的时候会被调用。

request.end([data][, encoding][, callback])

发送请求完毕。如果body的数据没被发送,将会将他们刷新到流里。如果请求是分块的,该方法会发送终结符0\r\n\r\n 。

如果指定了data,等同于先调用request.write(data, encoding),再调用request.end(callback)

如果有callback,将会在请求流结束的时候调用。

request.abort()

终止一个请求. (v0.3.8开始新加入)。

request.setTimeout(timeout[, callback])

如果socket被分配给这个请求,并完成连接,将会调用socket.setTimeout()

request.setNoDelay([noDelay])

如果socket被分配给这个请求,并完成连接,将会调用socket.setNoDelay()

request.setSocketKeepAlive([enable][, initialDelay])

如果socket被分配给这个请求,并完成连接,将会调用socket.setKeepAlive()

http.IncomingMessage

http.Serverhttp.ClientRequest创建了IncomingMessage对象,作为第一个参数传递给'response'。它可以用来访问应答的状态,头文件和数据。

它实现了Readable Stream接口,以及以下额外的事件,方法和属性。

事件: 'close'

function () { }

表示底层连接已经关闭。和'end'类似,这个事件每个应答只会发送一次。

message.httpVersion

客户端向服务器发送请求时,客户端发送的 HTTP 版本;或者服务器想客户端返回应答时,服务器的HTTP版本。通常是'1.1''1.0'

另外,response.httpVersionMajor是第一个整数,response.httpVersionMinor是第二个整数。

message.headers

请求/响应头对象。

只读的头名称和值的映射。头的名字是小写,比如:

// Prints something like:
//
// { 'user-agent': 'curl/7.22.0',
//   host: '127.0.0.1:8000',
//   accept: '*/*' }
console.log(request.headers);

message.rawHeaders

接收到的请求/响应头字段列表。

注意,键和值在同一个列表中。它并非一个元组列表。所以,偶数偏移量为键,奇数偏移量为对应的值。

头名字不是小写敏感,也没用合并重复的头。

// Prints something like:
//
// [ 'user-agent',
//   'this is invalid because there can be only one',
//   'User-Agent',
//   'curl/7.22.0',
//   'Host',
//   '127.0.0.1:8000',
//   'ACCEPT',
//   '*/*' ]
console.log(request.rawHeaders);

message.trailers

请求/响应的尾部对象。只在'end'事件中存在。

message.rawTrailers

接收到的原始的请求/响应尾部键和值。仅在'end'事件中存在。

message.setTimeout(msecs, callback)

  • msecs {Number}
  • callback {Function}

调用message.connection.setTimeout(msecs, callback).

message.method

仅对从http.Server获得的请求有效。

请求方法如果一个只读的字符串。例如:'GET','DELETE'.

message.url

仅对从http.Server获得的请求有效。

请求的URL字符串。它仅包含实际的HTTP请求中所提供的URL,比如请求如下:

GET /status?name=ryan HTTP/1.1\r\n
Accept: text/plain\r\n
\r\n`

`request.url` 就是:

`'/status?name=ryan'

如果你想将URL分解,可以用require('url').parse(request.url),例如:

node> require('url').parse('/status?name=ryan')
{ href: '/status?name=ryan',
  search: '?name=ryan',
  query: 'name=ryan',
  pathname: '/status' }

如果想从查询字符串中解析出参数,可以用require('querystring').parse函数,或者将true作为第二个参数传递给require('url').parse。 例如:

node> require('url').parse('/status?name=ryan', true)
{ href: '/status?name=ryan',
  search: '?name=ryan',
  query: { name: 'ryan' },
  pathname: '/status' }

message.statusCode

仅对从http.ClientRequest获取的响应有效。

3位数的HTTP响应状态码404

message.statusMessage

仅对从http.ClientRequest获取的响应有效。

HTTP的响应消息。比如,OKInternal Server Error.

message.socket

和连接相关联的net.Socket对象。

通过HTTPS支持,使用request.connection.verifyPeer()request.connection.getPeerCertificate()获取客户端的身份信息。

由JSRUN为你提供的JS在线运行、在线编译工具
        JSRUN提供的JS 在线运行,JS 在线运行工具,基于linux操作系统环境提供线上编译和线上运行,具有运行快速,运行结果与常用开发、生产环境保持一致的特点。
yout