Node.js部分模块
Node.js —— 模块
一、模块
1. 描述
module.exports = 对象 默认是一个空对象,用于导出该模块中的内容
require() 是一个全局函数,用于引入其他模块,返回模块导出的对象
__dirname 是模块中的局部变量,获取当前模块的绝对路径
__filename 是模块中的局部变量,获取当前模块的绝对路径和模块名称
2. 代码演示
- 被导入模块 eye.js
console.log('眼部模块被导入了');
var a = 2;
function fn() {
return 4;
}
module.exports = {
mya: a,
myfn: fn
}
- head.js
var myEye = require('./eye.js');
console.log(myEye.mya); // 2
console.log(myEye.myfn()); // 4
console.log(__dirname); // C:\Users\web\Desktop\node.js测试
console.log(__filename); // C:\Users\web\Desktop\node.js测试\head.js
二、模块分类
| 以路径开头 | 不以路径开头 | |
|---|---|---|
| 文件模块 | require('./circle.js'),用于引入自定义模块 | require('url'),用于引入官方核心模块 |
| 目录模块 | require('./02_tao'),会到目录下寻找package.json文件中main属性对应的文件,如果找不到会自动寻找index.js | require('tao'),用于引入第三方模块,首先会到当前目录下的node_modules目录中寻找tao,如果找不到,会一直往上一级目录下寻找 |
三、下载第三方模块
1. 概念
commonJS :是一种规范,制定了模块的引入和导出规范,Node.js下模块概念基于这种规范
包 (package) :指第三方模块,都是目录模块形式
npm :用于管理第三方模块的工具,包括下载安装、升级、卸载、上传...会在nodejs安装时附带安装
2. 基本命令
- npm init -y —— 初始化一个项目说明文件
- npm install 包的名称 —— 下载安装指定的包,会将包下载到当前目录下的node_modules中,如果node_modules不存在,会自动创建;会自动生成一个package-lock.json用于记录安装的包的名称和版本号(锁定包的版本号)。同时会在package.json中记录下载的这个包的名称和版本号。
- npm install —— 自动安装package.json和package-lock.json中记录的包
- npx -p node@版本号 node 文件名称 —— 先下载安装指定版本的Node.js,下载成功后,再使用这个版本的Node.js运行文件,运行成功后就删除这个版本的Node.js
- npm config get registry —— 获取当前下载仓库的地址
- npm config set registry http://registry.npm.taobao.org —— 设置下载的仓库地址为淘宝镜像(改为国内服务器)
三、官方核心模块
1. querystring
- 描述
查询字符串是浏览器向服务器端传递数据的一种方式,位于URL(统一资源定位)中 - 解析查询字符串 —— parse
// 1. 引入查询字符串模块
const querystring = require('querystring'); // 源代码:lib/querystring.js
// 2. 查询字符串
let str = 'keyword=笔记本&price=4199&enc=utf-8';
// 3. 使用查询字符串模块解析为对象
let obj = querystring.parse(str);
console.log(obj); // [Object: null prototype] { keyword: '笔记本', price: '4199', enc: 'utf-8' }
console.log(obj.keyword, obj.price, obj.enc);
2. url
- 描述
URL:统一资源定位符,互联网上任何内容都有一个对应的网址可以访问到,这个网址就叫URL - 解析URL
//引入URL模块
const url=require('url');
const querystring=require('querystring');
let str='http://www.codeboy.com:9999/product_details.html?lid=18';
//使用URL模块解析URL
let obj=url.parse(str);
console.log(obj);
/*
Url {
protocol: 'http:',
slashes: true,
auth: null,
host: 'www.codeboy.com:9999',
port: '9999',
hostname: 'www.codeboy.com',
hash: null,
search: '?lid=18',
query: 'lid=18',
pathname: '/product_details.html',
path: '/product_details.html?lid=18',
href: 'http://www.codeboy.com:9999/product_details.html?lid=18' }
*/
3. fs
const fs = require('fs');
- 创建目录
// 同步
fs.mkdirSync('./mydir');
// 异步
fs.mkdir('./mydir', function(err) {
if (err) throw err;
console.log('创建成功');
});
- 移除空目录
fs.rmdirSync('./mydir');
fs.rmdir('./mydir', function(err) {
if (err) throw err;
console.log('成功删除空目录');
});
- 查看文件状态
// 同步
var result = fs.statSync('./mydir');
// 异步
fs.stat('./mydir', function(err, res) {
if (err) throw err;
console.log(res);
console.log(res.isFile()); // false
console.log(res.isDirectory()); // true
})
- 读取目录
// 同步(只能读取当前这一层的文件名和目录名,思考:如何递归读取文件)
var res = fs.readdirSync('./');
// 异步
fs.readdir('./', function(err, res) {
if (err) throw err;
console.log(res); // [ 'file.js', 'mydir' ]
})
- 覆盖写入文件
/*
如果文件不存在,会先创建文件然后写入数据;
如果文件已经存在,会先清空文件中的内容然后写入数据。
*/
// 同步
fs.writeFileSync('./mydir/1.txt', '123');
// 异步
fs.writeFile('./mydir/1.txt', '456', function(err) {
if (err) throw err;
console.log('覆盖修改成功');
})
- 追加写入文件
/*
如果文件不存在,会先创建文件然后写入数据;
如果文件已经存在,会在文件末尾追加写入数据。
*/
// 同步
fs.appendFileSync('./mydir/1.txt', '789');
// 异步
fs.appendFile('./mydir/1.txt', '789', function(err) {
if (err) throw err;
console.log('追加修改成功');
})
- 读取文件内容
// 同步
var res = fs.readFileSync('./mydir/1.txt');
// 异步
fs.readFile('./mydir/1.txt', function(err, res) {
if (err) throw err;
console.log(res); // <Buffer 34 35 36 37 38 39 37 38 39>
})
- 删除文件
// 只能用于删除文件,思考:删除目录?
// 同步
fs.unlinkSync('./mydir/1.txt');
// 异步
fs.unlink('./mydir/1.txt', function(err) {
if (err) throw err;
console.log('成功删除文件');
})
- 检测文件(目录)是否存在
// 同步
var res1 = fs.existsSync('./mydir');
var res2 = fs.existsSync('./file.js');
console.log(res1, res2); // false true
// 异步
fs.exists('./mydir', function(res) {
console.log(res);
})
- 拷贝文件
// 同步
if (fs.existsSync('./mydir')) fs.copyFileSync('./mydir/1.txt', './2.txt');
// 异步
fs.copyFile('./mydir/1.txt', './6.txt', function(err) {
if (!fs.existsSync('./mydir/1.txt')) return;
if (err) throw err;
})
- 流 stream
// 1. 创建可读取的文件流
let rs = fs.createReadStream('./mydir/1.txt');
// 事件:监听是否有数据流入
// on(事件名称, 回调函数) —— 添加事件
// data 固定,表示一旦有数据流入,自动通过回调函数获取
/*
let count = 0; // 用于统计次数
rs.on('data', (chunk) => {
// chunk表示分段的数据
// console.log(chunk);
count++; // 读取一段,记录一次
});
// 添加读取结束:一旦读取结束,调用回调函数
rs.on('end', () => {
console.log(count);
});
*/
// 2. 创建可写入的流
let ws = fs.createWriteStream('./2.zip');
// 3. 把读取的文件流通过管道添加到写入的文件流
// 最终完成文件拷贝
rs.pipe(ws);
4. http
用于创建WEB服务器
// 引入http模块
const http = require('http');
// 创建WEB服务器
const app = http.createServer();
// 设置端口
app.listen(8080);
// http://127.0.0.1:8080
// http://localhost:8080
// 接收请求并作出响应
// 事件:一旦请求服务器,自动调用回调函数
app.on('request', (req, res) => {
// console.log('有一个人要买煎饼');
// req 请求的对象
// 获取请求的URL
console.log(req.url, req.method);
// 根据请求的内容作出判断
// res 响应的对象
// 设置响应的内容
res.write('这是你的jianbing');
// 结束并发送响应
res.end();
// 设置响应的状态码和要跳转的URL
res.writeHead(302, {
Location: 'http://www.tmooc.cn/'
});
// 结束并发送响应
res.end();
res.writeHead(404); // 设置状态码为404
res.write('Not Found');
res.end();
});

浙公网安备 33010602011771号