官网API文档
nodejs.cn/api
nodemon – 自动重启工具
npm install -g nodemon --save -dev
nodemon index
浏览器访问网站过程
- 在浏览器地址栏中输入网址
- 浏览器通过用户再地址栏中输入的URL构建HTTP请求报文
- 浏览器发起DNS解析请求,将域名转换为IP地址
- 浏览器将请求报文发送给服务器
- 服务器接收请求报文,并解析
- 服务器处理用户请求,并将处理结果封装成HTTP响应报文
- 服务器将HTTP响应报文发送给浏览器
- 浏览器接收服务器响应的HTTP报文,并解析
- 浏览器解析HTML页面并展示,在解析HTML页面时遇到的新的资源需要再次发起请求
- 最终浏览器展示出了页面
node.js 特点
- 事件驱动(当事件被触发时,执行传递过去的回调函数)
- 非阻塞I/O模型
- 单线程
- npm
nvm-windows 控制多个版本的node
- https://github.com/coreybutler/nvm-windows
- 常用命令
- nvm version
- nvm install latest
- nvm install 版本号
- nvm uninstall 版本号
- nvm list
- nvm use 版本号
REPL(交互式解释器)
R 读取:读取用户输入,解析输入了 Javascript 数据结构并存储在内存中
E 执行:执行输入的数据结构
P 打印:输出结果
L 循环:循环操作以上步骤直到用户两次按下 ctrl-c 退出
模块的使用
process 模块在使用的时候无需通过 require() 函数来加载该模块,可以直接使用
fs 模块在使用的时候,必须通过 require() 函数来加载该模块,方可使用
let fs = require('fs')
原因:process模块是全局模块,而fs 模块不是全局模块,全局模块可直接使用
request 和 response 对象介绍
request ( http.IncomingMessage ):服务器解析用户提交的 http 请求报文,将结果解析到 request 对象中,凡是要获取和用户请求相关的数据都可以通过 request 对象获取
request 对象常用成员
request.headers:返回的是一个对象,包含了所有的请求报文头
request.rawHeaders:返回的是一个数组,包含了所有的请求报文头的字符串
request.httpVersion:获取请求客户端所使用的 http 版本
request.method:获取客户端请求使用的方法(POST、GET...)
request.url:获取这次请求报文中的路径,不包含主机名称、端口号、协议
response ( http.ServerResponse ):在服务器端用来向用户做出响应的对象。凡是需要向用户(客户端)响应的操作,都需要通过 response 对象来进行
response.write()
response.end():结束响应(请求) ,告诉服务器该响应的报文头、报文体等等全部已经响应完毕了,可以考虑本次响应结束。res.end()要响应数据的话,数据必须是String类型或者是Buffer类型
res.setHeader():设置响应报文头,要放在res.write()和res.end()之前设置,即使我们不设置响应报文头,系统也会默认有响应报文头,并且默认发送给浏览器,当已经发送过响应报文头后,就不能再通过res.setHeader()设置请求报文头了
res.statusCode:设置 http 响应状态码
res.statusMessage:设置 http 响应状态码对应的信息
res.writeHead():直接向客户端响应写入 http 配置
res.writeHead('200','OK',{
'Content-Type': 'text/plain; charset=utf-8'
})
res.writeHead()会替代 res.setHead()
NPM - Node Package Manager - Node包管理器
官网: https://www.npmjs.com
官方文档: https://docs.npmjs.com
更新 npm :
npm install npm@latest -g
模块(Modules)和包(Packages)的区别
模块可以是任何一个文件或目录(目录下可以有很多个文件),只要能被node.js 通过 require() 即可
包是一个文件或目录(目录下可以有多个文件)必须有一个package.json文件来描述,就是一个包
Package.json 文件介绍
package.json 文件中常见的项
name:包的名字
version:包的版本
description:包描述
author:包的作者
main:包的入口js文件,从main字段这里指定的那个文件开始执行
dependencies:当前包依赖的其他包
创建 package.json 文件
npm init
或 npm init -y
package-lock.json 文件中存放着 package.json 所有依赖包的信息
underscore的使用
官网:underscorejs.org
npm install underscore
node.js模块分类
- 核心模块(内置模块,核心模块)
所有内置模块在安装 node.js 的时候就已经编译成二进制文件,可以直接加载运行(速度较快) 部分内置模块,在 node.exe 这个进程启动的时候就已经默认加载了, 所以可以直接使用。
fs, http, path, url…
- 文件模块
如果加载时,没有指定后缀名,那么就按照如下顺序依次加载相应模块
.js .json .node(C/C++编写的模块)
- 自定义模块(第三方模块)
mime, mongo, cheerio, moment
require 的使用
所有模块第一次加载完毕后都会有缓存,二次加载直接读取缓存,避免了二次开销
require 中的参数分为两种形式,相对路径下的文件,或项目名,查找顺序
- 情况1: require() 的参数是一个路径
require(’./index2’)
index2.js -> index2.json -> index2.node -> (index2 文件夹 -> package.json -> main(入口文件 app.js -> index.js / index.json / index.node)) -> 加载失败
- 情况2:require() 的参数不是路径,直接就是一个模块名称
先在核心模块中查找,是否有和给定名字一样的模块,如果有,则直接加载核心模块
如果核心模块没有改模块,就会认为这个模块是第三方模块(自定义模块)
先去当前 js 文件所在的目录下去找是否一个一个 node_modules 文件夹