Node — 第二天
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字符串格式
- 遇到的问题
- 解决跨域的问题 – 设置响应头
- 解决编码的问题 – 设置响应头
- 读取books.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 — 第二天相关推荐
- 标梵互动:微信公众号开发之node第二篇
accessToken凭证获取 access_token是调用微信接口的唯一凭证,目前有效期为两小时,调用上限为每日2000次,access_token过期后需要重新获取 一:功能实现思路 查看本地是 ...
- 第二章:小朱笔记hadoop之源码分析-脚本分析
第二章:小朱笔记hadoop之源码分析-脚本分析 第一节:start-all.sh 第二节:hadoop-config.sh 第三节:hadoop-env.sh 第四节:start-dfs.sh 第五 ...
- 入职新公司-如何更快的适应节奏(第二周要干活)
刚入职新公司的第一周应该是比较紧张的,因为第一周算是我们熟悉的时间,到第二周有可能就要开始做项目了,甚至有的节奏快的公司也就让你熟悉个两三天后就开始干活了.那么在这短短的几天的时间里,我们应该重点熟悉 ...
- 011_Cascader级联选择器
1. Cascader级联选择器 1.1. 当一个数据集合有清晰的层级结构时, 可通过级联选择器逐级查看并选择. 1.2. Cascader属性 参数 说明 类型 可选值 默认值 value / v- ...
- [PHP] 算法-合并两个有序链表为一个有序链表的PHP实现
合并两个有序的链表为一个有序的链表: 类似归并排序中合并两个数组的部分 1.遍历链表1和链表2,比较链表1和2中的元素大小 2.如果链表1结点大于链表2的结点,该结点放入第三方链表 3.链表1往下走一 ...
- python 链表的基础概念和基础用法
一.什么是链表 链表是由多个不同的节点组成,每个节点通过指针区域关联到一起 链表的头指针,指向了头节点,通过头指针可以找到其他节点信息 二.什么是节点 链表由节点组成,每个节点又包含两个部分,一个是元 ...
- 应用存储和持久化数据卷:存储快照与拓扑调度(至天)
本文将主要分享以下两方面的内容: 存储快照概念.使用与工作原理: 存储拓扑调度背景.概念.使用与工作原理. 基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据 ...
- 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度
作者 | 至天 阿里巴巴高级研发工程师 一.基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据进行 snapshot ,以及能快速 restore 的能力.另 ...
- 面试中必知必会的那些题——单链表倒置
(准备面试,多看点题.来自原文) 我想你去很多家公司面试的时候,遇到单链表倒置的问题可能比较多,如果一定要给面试题来一个排名,估计也能上top10吧,其实这个题目玩的是技巧和你对单链表的理解,其实我们 ...
最新文章
- 为什么说机器学习是预防欺诈的最佳工具?
- 如何打印Qt中的枚举所对应的字符串
- python管道_python中管道用法入门,举个例子
- 关于三层交换机的路由处理方式和路由器的路由处理方式的不同
- 计算机软件水平考试英语试题,计算机软考软件设计师英语试题及答案解析(3)
- 计算机中考什么时候报名,中考报名时间
- crypto 乱码_base64编码加密解密程序,输出有乱码,为什么?
- java ip范围_Java判断IP是否在指定范围
- java核心技术卷1基础知识整理
- vue 开发App监听手机 返回键返回上级路由以及退出
- 颠覆性创新:未来人人都可以构建一个元宇宙
- 软件服务化:管理当先
- 绘本“深阅读’’的教学探索
- win10进程太多怎么优化_你应该这样用win10(优化篇)
- tp6 隐藏身份证号中间8位
- 基于linux2.6.30.4内核的DM9000网卡驱动编译成模块成功ping通
- [经验栈]C#监测IPv4v6网速及流量
- GameOff2022参与有感
- [AFCTF2018]花开藏宝地
- 基于Python+django的 医院排队叫号系统-计算机毕业设计