Nodejs学习
什么是NodeJs?
- 是基于谷歌V8JS引擎运行的JavaScript环境
Node中处处皆模块:
- 创建的JS文件都是自定义模块
- Node中自带了很多内置模块
npm
下载的是第三方模块
使用
导出/暴露模块:
语法:
module.exports
modue
是Node中的一个全局对象;
module.exports
是模块的出口,默认值是一个对象{}
加载:
require
/*Demo:*/ let obj = require(‘模块路径’)
加载自定义模块,必须加路径,至少是./
,但是可以省略后缀
内置模块(核心模块):
fs文件系统模块:
加载模块(初始化):
const fs = require('fs');
异步读取文件方法:
fs.readFile('路径/变量', '编码(默认utf-8)', (err, data) => {})
回调函数的注意事项:
err
处的形参表示错误信息data
处的形参表示读取的结果- 能读取文件,形参
err
为null
,data
处返回二进制字符串 - 不能读取文件,形参
err
为一个对象{name, message}
;形参data
为undefined
- 视频、音频、图片文件不需要写编码
异步写入文件方法:
fs.writeFile('路径/变量', '写入的内容', err => {})
注意:
- 如果文件存在,覆盖原有的内容
- 如果文件不存在,创建一个新的文件
err
无报错返回null
;报错返回对象(同上)
err
中始终有一个看不见的message
方法,错误条件判断的时候可以输出err.message
path模块:
加载模块(初始化):
const path = require('path')
获取路径中的后缀:
path.extname(路径变量)
Ex:
path.basename(url, 需要忽略的后缀名)
路径拼接:
path.join(路径/变量 | __dirname)
注意:
__dirname
代表抓取当前JS文件的绝对路径- 变量可以写多个,也可以直接写字符串
- 默认转换
/
→\
划线
querysting模块(
旧)
作用:处理字符串
加载模块(初始化):
querystring = require('querystring')
序列化:将对象类型转换成字符串
querystring.stringify(变量)
反序列化:将字符串类型转换
querystring.parse(变量)
- 默认会将中文编码,以及编码的字符解码
http模块
基础http模块四步:
1.导入:
const http = require('http');
2.创建:
server = http.createServer();
3.监听
server.on('request', (req, res) => {
//回复响应(响应体)
res.end(); //必写!!
})
4.启动
server.listen(端口, function() {console.log('服务器启动了')})
res.end
响应体:
- 必须放到最后写,不能在设置了响应体后又设置请求信息
- 响应体无论如何都只能是字符串
扩展:
一些可以写在监听事件中的模块对象,他们可以帮助设置http
服务的参数
1.参数req
处负责控制请求相关的信息:
获取请求方式,比如得到get
、post
req.method
获取请求地址中除根路径意外的部分(可以理解为网页的域名后面的/
后的内容)
req.url
2.参数res
负责控制响应相关的信息
设置响应的状态码(并非业务的状态码)
res.statusCode = 200
设置响应头
res.setHeader('key', 'value')
可以通过设置响应头的形式控制响应回复的形式
例如:
1.响应中文
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
2.响应html网页提示或信息
res.setHeader('Content-Type', 'text/html; charset=utf-8')
更多的请求头可查询菜鸟教程
常见的媒体格式类型:
npm使用
初始化
npm init -y
下载模块
npm install or i
指定下载某个版本
npm install 软件名@版本号
注意:npm
默认从国外下载,速度很慢
方法一:直接改成国内淘宝镜像
npm config set registry https://registry.npmmirror.com
方法二:下载nrm更新镜像源
npm i nrm
nrm ls
nrm use taobao
卸载模块:
npm uninstall or un
加载模块:
const moment = require('moment')
实际开发中的开发依赖和项目依赖:
- 项目依赖
npm i 包名
npm 包名 --save
npm 包名 -S
项目依赖都会写在package.json
的dependencies
文件中
- 开发依赖(非必须)
npm i 包名 --save-dev
npm 包名 -D
开发依赖都会写在package.json
的devDependencies
文件中
项目中收到package.json
文件导入需要的包:
下载开发依赖以及项目依赖
npm i
只下载项目依赖
npm i --production
怎样使用第三方模块?
• 和使用内置模块一样,需要使用 require
加载模块
• 调用模块提供的方法完成工作
• 不用担心不会用,好的第三方模块都会用使用文档或者官方网站的。
• 有些模块没有官网,去 github 查找模块的使用文档,或者百度。
全局模块
在安装包名后面加 -g
即可
卸载全局模块也同样
jasontoken使用
const jwt = require('jsonwebtoken')
// 参数1:存储的对象 参数2:加密的字符串 参数3:有效期
token = "Bearer " + jwt.sign(
{id: 8}, "secret", {expiresIn: '1d'}
);
console.log(token);
//token分为Bear and Bearer
require的加载机制
- 判断缓存中有没有正在加载的模块,如果有,使用缓存的内容,没有就创建
- 判断有没有
./
路径前缀
if
有路径,加载自定义模块 => 找同名 => 找.js后缀 => 找.json后缀 =>报错
故然模块不能省略路径前缀,但可以省略文件后缀(默认)
if
无路径,加载内置模块 => 加载第三方模块