http模块

搭建服务器的步骤

① 导入 http 模块

② 创建 web 服务器实例

③ 为服务器实例绑定 request 事件,监听客户端的请求

④ 启动服务器

// ① 导入 http 模块
const http = require('http');// ② 创建 web 服务器实例
const server = http.createServer();// ③ 为服务器实例绑定 request 事件,监听客户端的请求
// server.on('事件名称', 处理函数);// 只要客户端发来请求,则会触发下面的事件
server.on('request', function () {console.log('你的请求我收到了');
});// ④ 启动服务器
server.listen(3000, function () {// 服务器启动之后,会触发这个回调函数console.log('my first web server start~');
});

测试:

  • node执行你的JS代码
  • 打开客户端(浏览器、postman),向服务器发送请求(localhost:3000)
  • 查看,代码中的请求事件,是否触发了,如果触发了,表示请求成功了

使用http搭建服务器的问题

  • 代码如果更改了,则需要重新启动服务器,你的代码才会生效

    • Ctrl + C , 先终止服务
    • 再次执行 node xxx.js 重新启动服务即可
  • vscode 终端的使用问题

URL的组成

http://www.xxxx.com:3000/yyy/zzz?id=123

  • 协议

    • http
    • https
  • 主机地址(找到服务器)
    • 指向服务器的域名,(localhost 永远指向自己的计算机)
    • 服务器的IP地址 (127.0.0.1 永远指向自己的计算机)
  • 端口
    • 作用是区分服务器上的每个服务的
    • 可以通过 netstat -an 查看已经被占用的端口
  • 文件路径部分(/api/getbooks index.html /a/b/c/xxx.html)
  • 查询字符串部分(GET请求的参数)

获取请求相关的信息

server.on('request',  function (req) {// req 对象,是根据 http.IncomingMessage类得来的对象// 通过这个对象,我们可以得到请求的相关信息req.url // 表示请求的urlreq.method // 表示请求方式req.headers // 表示请求头
})

得到请求相关的信息之后,方便服务器做出判断

服务器做出响应

server.on('request',  function (req, res) {// 所有和请求相关的信息,都是通过req对象获取的// 所有和响应相关的信息,都通过res来完成。res这里是response的意思。// console.log(res instanceof http.ServerResponse); // true// res.end(); // 用于做出响应// res.setHeader(name, value); // 设置响应头// res.statusCode // 设置响应状态码// res.writeHead(状态码, {响应头})// 告诉浏览器,响应的数据是什么类型、什么编码// res.setHeader('Content-Type', 'text/html; charset=utf-8');// res.statusCode = 404; // 随便设置的状态码,实际中应该是200res.writeHead(200, {// key: value'Content-Type': 'text/html; charset=utf-8','Author': 'LaoTang', // 随便写的,实验一下。值不能用中文});res.end('你好浏览器,你的请求我收到了,这是给你的回应');
})

GET方式的接口

  • 提供数据给客户端(终极目标)

  • 具体的获取书籍的接口

    • 读取books.json里面的内容

      • fs.readFile() — 读取的结果是json格式
      • require() — 读取的结果是array格式
    • 把读取的结果响应给客户端 — 响应的结果,必须是json字符串格式
    • 遇到的问题
      • 解决跨域的问题 – 设置响应头
      • 解决编码的问题 – 设置响应头

POST方式的接口

  • 接收并保存数据(终极目标)
  • 如何接收POST请求体
    • 定义空字符串,比如str
    • 注册req的data事件,用于接收客户端提交的数据
    • 注册req的end事件,当完全接收到了客户端提交的数据,会触发这个事件
  • 保存数据
  • 做出响应
// 加载所需的模块
const fs = require('fs');
const path = require('path');
const querystring = require('querystring');
// 搭建服务器
const http = require('http');
const server = http.createServer();
server.listen(3006, () => console.log('图书管理案例接口服务启动了'));server.on('request', (req, res) => {// 客户端都会发送什么类型的请求,请求的url又是什么let method = req.method; // 获取请求方式let url = req.url; // 获取请求的url// 定义书籍 books.json的绝对路径let filename = path.join(__dirname, 'books.json');// 判断,请求的是否是获取图书的接口if (method === 'GET' && url === '/api/getbooks') {// 说明客户端请求的就是获取书籍的接口// 把所有书籍信息响应给客户端// 读取books.json里面的内容,把读取的结果响应给客户端// 读取json文件,可以直接使用 require let data = require(filename);// console.log(data); // 得到一个数组res.writeHead(200, {'Access-Control-Allow-Origin': '*', // 解决跨域问题'Content-Type': 'application/json; charset=utf-8'});res.end(JSON.stringify({status: 200,msg: '获取图书成功',data: data}));} else if (method === 'POST' && url === '/api/addbook') {// 说明请求的是添加图书的接口// console.log(111);// 1. 接收客户端提交的数据// 1.1 定义一个空字符串,一会要把接收到的数据拼接到空字符串中let str = '';// 1.2 注册req的data事件,用于接收客户端提交的数据// 当接收到客户端的提交的数据的时候,就会触发这个事件,形参chunk就是接收到一部分数据req.on('data', (chunk) => {str += chunk;});// 1.3 注册req的end事件,当完全接收到了客户端的数据之后,会触发req.on('end', () => {// console.log(str); // 完整的数据 // bookname=aaa&author=bbb&publisher=ccc// 2. 保存到 books.json中let old = require(filename); // 得到数组let newBook = querystring.parse(str);newBook.id = Date.now(); // 临时使用时间戳当做idold.push(newBook);fs.writeFile(filename, JSON.stringify(old), (err) => {if (err) return console.log(err);// 没有错误,保存成功// 3. 做出响应res.writeHead(200, {'Access-Control-Allow-Origin': '*', // 解决跨域问题'Content-Type': 'application/json; charset=utf-8'});res.end(JSON.stringify({status: 201,msg: '添加图书成功',}));});});} else {res.end('错误');// 说明客户端代码写错了。客户端请求了一个不存在的资源}
});

npm初步使用

介绍

npm(node package manager)node包管理器。

包是什么?包就是模块。

npm这个工具,在安装node的时候,就已经安装到你的计算机中了。

命令行中执行: npm -v ,如果看到版本号,说明安装成功了。

作用

npm的作用是:管理node模块的工具。

  • 下载并安装第三方的模块
  • 卸载第三方模块
  • 发布模块
  • 删除已发布的模块

第三方模块:

  • 非内置模块,安装完node,还不能使用的模块,需要从网上下载安装,才能使用的模块
  • 第三方模块是个人、公司、组织编写的模块,发布到网上,供我们使用

npm 就是一个管理(下载安装、卸载…)第三方模块的工具

初始化

使用npm工具之前,必须先初始化。

npm init -y
# 或
npm init
# 然后一路回车

初始化之后,会在项目目录中生成 package.json 的文件。

什么第三方模块

非node自带的模块。

是别人写的模块,然后发布到npm网站,我们可以使用npm工具来下载安装别人写的模块。

第三方模块,都是在node核心模块的基础之上,封装了一下,实现了很多非常方便快速简洁的方法。

目前,npm网站收录了超过 150万个第三方模块。

安装卸载项目模块

下载安装第三方模块

npm install 模块名
npm i 模块名

卸载模块

npm uninstall 模块名
npm un 模块名

关于项目模块的说明

  • 下载安装的模块,存放在当前文件夹的 node_modules 文件夹中,同时还会生成一个记录下载的文件 package-lock.json
  • 下载的模块,在哪里可以使用
    • 在当前文件夹
    • 在当前文件夹的子文件夹
    • 在当前文件夹的子文件夹的子文件夹
  • 怎样使用第三方模块
    • 和使用内置模块一样,需要使用 require 加载模块
    • 调用模块提供的方法完成工作(一般好的模块都会用使用文档的)

演示下载安装第三方模块:moment

这里演示一个处理时间日期的模块 – moment

下载安装moment模块

npm init -y
npm i moment

演示使用moment模块处理时间

// 加载模块
const moment = require('moment');console.log(moment().format('YYYY-MM-DD hh:mm:ss'));
// 官网:http://momentjs.cn

全局模块

  • 全局安装的模块,不能通过 require() 加载使用。

  • 全局安装的模块,一般都是命令或者工具。

  • 安装方法,在安装模块的命令后面,加 -g

    npm i 模块名 -g
    # 或
    npm i -g 模块名
    
  • 卸载方法(也是多一个 -g

    npm un 模块名 -g
    
  • 全局安装的模块,在系统盘(C盘)

    • 通过命令 npm root -g 可以查看全局安装路径

mac安装过程可能出现权限问题,可以使用 sudo npm i xxx -g

全局安装nodemon模块

  • 安装命令

    npm i nodemon -g
    
  • nodemon的作用:

  • 代替node命令,启动服务的,当更改代码之后,nodemon会自动帮我们重启服务。

  • 运行nodemon,如果报错如下:

  • 解决办法是:

    • 管理员方式,打开命令行窗口
    • 执行 set-ExecutionPolicy RemoteSigned;
    • 在出现的选项中,输入 A,回车。即可

更改镜像源

镜像源,就是下载安装第三方模块的网站。

我们下载的第三方模块都是从国外的npm主站下载的,速度比较慢。

淘宝在国内对npm上的第三方模块做了一个备份,也就是说,我们可以从国内下载第三方模块。

除了淘宝之外,还有很多其他镜像源。

简单的更改镜像源方法:

  • 全局安装 nrm 的模块
  • npm i nrm -g
    • nrm 用于管理镜像源
  • 使用nrm
    • nrm ls 通过这个命令,可以查看可用的镜像源
    • nrm use taobao ,切换下载模块的网站为淘宝

注意 :如果 nrm 安装失败,请修改电脑的环境变量,给环境变量添加上 npm 的绝对地址,再次查询即可

查询版本

nrm - y

使用已下nmp 代码可以根据 package.json重新安装node_modules中的模块信息

npm  i

如果安装出现错误:
1. 查看 npm 版本
2. 镜像源的配置

Node — 第二天相关推荐

  1. 标梵互动:微信公众号开发之node第二篇

    accessToken凭证获取 access_token是调用微信接口的唯一凭证,目前有效期为两小时,调用上限为每日2000次,access_token过期后需要重新获取 一:功能实现思路 查看本地是 ...

  2. 第二章:小朱笔记hadoop之源码分析-脚本分析

    第二章:小朱笔记hadoop之源码分析-脚本分析 第一节:start-all.sh 第二节:hadoop-config.sh 第三节:hadoop-env.sh 第四节:start-dfs.sh 第五 ...

  3. 入职新公司-如何更快的适应节奏(第二周要干活)

    刚入职新公司的第一周应该是比较紧张的,因为第一周算是我们熟悉的时间,到第二周有可能就要开始做项目了,甚至有的节奏快的公司也就让你熟悉个两三天后就开始干活了.那么在这短短的几天的时间里,我们应该重点熟悉 ...

  4. 011_Cascader级联选择器

    1. Cascader级联选择器 1.1. 当一个数据集合有清晰的层级结构时, 可通过级联选择器逐级查看并选择. 1.2. Cascader属性 参数 说明 类型 可选值 默认值 value / v- ...

  5. [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现

    合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...

  6. python 链表的基础概念和基础用法

    一.什么是链表 链表是由多个不同的节点组成,每个节点通过指针区域关联到一起 链表的头指针,指向了头节点,通过头指针可以找到其他节点信息 二.什么是节点 链表由节点组成,每个节点又包含两个部分,一个是元 ...

  7. 应用存储和持久化数据卷:存储快照与拓扑调度(至天)

    本文将主要分享以下两方面的内容: 存储快照概念.使用与工作原理: 存储拓扑调度背景.概念.使用与工作原理. 基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据 ...

  8. 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度

    作者 | 至天 阿里巴巴高级研发工程师 一.基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据进行 snapshot ,以及能快速 restore 的能力.另 ...

  9. 面试中必知必会的那些题——单链表倒置

    (准备面试,多看点题.来自原文) 我想你去很多家公司面试的时候,遇到单链表倒置的问题可能比较多,如果一定要给面试题来一个排名,估计也能上top10吧,其实这个题目玩的是技巧和你对单链表的理解,其实我们 ...

最新文章

  1. 为什么说机器学习是预防欺诈的最佳工具?
  2. 如何打印Qt中的枚举所对应的字符串
  3. python管道_python中管道用法入门,举个例子
  4. 关于三层交换机的路由处理方式和路由器的路由处理方式的不同
  5. 计算机软件水平考试英语试题,计算机软考软件设计师英语试题及答案解析(3)
  6. 计算机中考什么时候报名,中考报名时间
  7. crypto 乱码_base64编码加密解密程序,输出有乱码,为什么?
  8. java ip范围_Java判断IP是否在指定范围
  9. java核心技术卷1基础知识整理
  10. vue 开发App监听手机 返回键返回上级路由以及退出
  11. 颠覆性创新:未来人人都可以构建一个元宇宙
  12. 软件服务化:管理当先
  13. 绘本“深阅读’’的教学探索
  14. win10进程太多怎么优化_你应该这样用win10(优化篇)
  15. tp6 隐藏身份证号中间8位
  16. 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
  17. [经验栈]C#监测IPv4v6网速及流量
  18. GameOff2022参与有感
  19. [AFCTF2018]花开藏宝地
  20. 基于Python+django的 医院排队叫号系统-计算机毕业设计

热门文章

  1. DIY人脸跟踪电风扇送女朋友(4)
  2. 结构体中的自然对界法则
  3. 关于 IAR 环境的一些使用 琐记
  4. 微信公众号接口添加菜单时错误(errcode:40017 invalid button type)
  5. 卷积神经网络经典模型要点
  6. 如何在Python中建立回归模型
  7. 信号处理深度学习机器学习_机器学习与信号处理
  8. 利用云功能和API监视Google表格中的Cloud Dataprep作业状态
  9. 网卡驱动:stmmac DMA接收流程
  10. 通过 Service 访问 Pod - 每天5分钟玩转 Docker 容器技术(136)