// 知道CommonJS规定了哪些内容:就是对代码进行模块化的拆分与组合时,需要遵循哪些规则
// 1.使用什么样的语法格式来引用模块
// 2.在模块中使用什么样的语法格式向外暴露成员
// Node.js中模块的根据来源不同分为三大类;三大分类各自是什么
// 1.内置模块(内置模块是由Node.js 官方提供的,例如fs、path、http等)
// 2.自定义模块(用户创建的每个js文件,都是自定义模块)
// 使用require()方法加载其他模块时,会执行被加载模块中的代码
// 3.第三方模块(由第三方开发的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载)
//例1:创建主模块(main.js)和功能模块(circle.js),
//在功能模块下创建两个函数,传递半径,
//返回圆的面积或者周长;在主模块下调用暴露的两个函数
main.js 里面代码
const a=require("./circle")
const zc=a.zhouchang(3);
const b=require("./circle01")
const mj=b.mianji(3);
console.log(`周长是${zc} 面积是${mj.toFixed(2)}`)
//mianji
module.exports.mianji=function(r){
return Math.pow(r,2)*Math.PI
}
//zhouchang
module.exports.zhouchang=function(r){
return 2*PI*r
}
在03_1.js文件中引入到同一级目录模块03_2,目录【03_2是个文件夹】中包含index.js,
//在文件中创建函数传递任意两个数字返回总和,暴露该函数;最后在03_1.js
//中调用这个函数
03_1.js
const a =require("./03_2")
03_2文件夹下的02.js
console.log('我先显示')
const a =require("./index.js")
console.log(a.fn(1,3))
03_2文件下的index.js
module.exports.fn=function(a,b){
return a+b
}
03_2下面的package包配置文件【设定谁先优先,谁就先在03_2文件下优先被找到】
{
"main":"02.js"
}
//(2)记录的包
//1.查询字符串模块(querrystring.js)
//查询字符串:浏览器端向服务端传递参数的一种形式,位于网址,格式
//http://www.codeboy.com:9999/products.html?kw=小米&a=1
//查询字符串模块用于操作查询字符串的工具模块
//parse()将查询字符串转为对象
//例子:
const querystring=require("querystring");
console.log(querystring);
//查询字符串
var str='kw=小米&a=1';
//将查询字符串转为对象,获取传递的值
var obj=querystring.parse(str);//parse 字符串
console.log(obj)//[Object: null prototype] { kw: '小米', a: '1' }
console.log(obj.kw,obj.a)//小米
//例如:获取以下查询字符串中传递的参数值【lid=18&count=2】答案如下:
const querystring=require("querystring");
//查询字符串
var str='lid=18&count=2'
//将查询字符串转为对象,获取传递的值
var obj=querystring.parse(str);//parse 把字符串转为对象
console.log(obj)
console.log(obj.lid,obj.count)//18,2
// 2.IP地址就是互联网上每台计算机的唯一地址:不直观,不便于记忆
//域名和域名服务器
// ip地址和域名是一 一对应的关系,这份对应关系存放在一个叫DNS的电脑里
// 域名服务器就是提供IP地址和域名之间的转换服务的服务器
// 端口号:就像门牌号
// 注意:每个端口号不能同时被多个web服务占用
// 在实际应用中,URL中的80端口可以被省略
//3.URL模块
将URL转换为对象
var
str='http://www/codeboy.com:9999/1.html?lid=8#one';
var obj=new URL(str);
console.log(obj.search.slice(1));//lid=8
//例如:获取以下URL中传递的参数,打印以下格式:
//’班级编号:xxx 课程名称:xxx‘
//
var
str='http://www/tmooc.cn:443/web.html?cid=2110&cname=node.js#one';
var obj=new URL(str);
var str=obj.search.slice(1);//?cid=2110&cname=node.js
const querystring=require("querystring");
var obj=querystring.parse(str);//parse 把字符串转为对象
//console.log(obj)
console.log(`班级编号${obj.cid} 课程名称:${obj.cname}`)//班级编号2110 课程名称:node.js
//4.定时器模块(timer)
//(1)一次定时器:
//开启
var timer=setTimeout(function(){
console.log('bom!!!')
},3000)
//清除
clearTimeout(timer);
//(2)周期性定时器
var timer=setInterval(function(){
console.log('bom!!!')
},2000)
clearInterval(timer)
//(3)立即执行定时器
console.log(2);
setImmediate(function(){
console.log(3);
})
console.log(1);
输出 2 1 3
//所有定时器中的回调函数都是在事件队列中执行
//例如:使用周期定时器,每隔3秒钟打印’嘀嘀嘀‘,打印3次后清楚定时器
//方法一:
var i=0;
var timer=setInterval(function(){
i++;
if(i===3)
clearInterval(timer)
console.log('嘀嘀嘀')
},3000)
//方法二:
var count=0;
var timer=setInterval(function(){
console.log('嘀嘀嘀')
count++;
if(i===3){
clearInterval(timer);
}
},1000);
//1.立即执行定时器
//processs.nextTick(回调函数)
//2.同步和异步
//同步:在主程序中执行,会阻止后续代码的执行,通过返回值来获取结果
//异步:回调函数
//3.文件系统模块fs
const fs=require('fs');
//(1)查看文件的状态
//方法一:
var s = fs.statSync('./03day01txt.js');
//方法二:
fs.stat('./03day01txt.js',function(err,dataStr){
if(err){
console.log('异步的结果'+err)
}
console.log('成功'+dataStr)
})
//
console.log('结束')
console.log(s)
//检测是否为目录
console.log(s.isDirectory());//返回false或者true
//检测是否为文件
console.log(s.isFile())
//(2)创建目录
//同步
fs.mkdirSync('./mydir');//在当前文件夹创建一个mydir的文件夹
console.log('结束')
//异步
fs.mkdir('./mydir02',function(err,dataStr){
if(err){console.log('err')}
console.log('结束')
})
//(3)练习使用同步和异步方法移除目录mydir和mydir02
//同步
fs.rmdirSync('./mydir');
console.log('结束')
//异步
fs.rmdir('./mydir02',function(err,dataStr){
if(err){console.log('err')}
console.log('结束')
})
//(4)写入文件
//同步方法:
fs.writeFileSync('./03day01txt.js','涛桑xxx');
//如果文件存在,则会更新内容;如果不存在会新建然后存入内容
console.log('结束')
//异步方法:
fs.writeFile('./03day01txt.js','dierci内容xxx',function(err){
if(err){
throw err;
}
})
console.log("成功");
//(5)追加写入
//同步方法:
fs.appendFileSync('./03day01txt.js','涛桑xxx');
//异步方法:
fs.appendFile('./03day01txt.js','涛桑222xxx\n',function(err){
if(err){
throw err;
}
})
console.log("成功")
//例如:创建数组,包含多个姓名,遍历数组获取每个姓名,将每个姓名使用异步方法写入到文件stu.txt
var arr=['小黄','小明','小红'];
for(i=0;i<3;i++){
fs.appendFile('./03day01txt.js',arr[i]+'\n',function(err){
if(err){
throw err;
}
console.log("写入成功")
});
}
//方法二:
var arr=['小黄','小明','小红'];
arr= arr.join('\r\n');
fs.appendFile('./03day01txt.js',arr,function(err,dataStr){
if (err) {
console.log('输入失败' + err.message)
}
console.log('输入成功' + arr)
})
//(6)读取文件
//异步方法:
var data=fs.readFileSync('./03day01txt.js');
console.log(data.toString());
//同步方法:
fs.readFile('./03day01txt.js','utf8',function(err,dataStr){
if (err) {
console.log('输入失败' + err.message)
}
console.log('输入成功' + dataStr)
})
//方法二:
fs.readFile(__dirname+'/03day01txt.js','utf8',function(err,dataStr){
if(err){
return console.log('输出失败'+err.message)
}
console.log('输出成功'+dataStr)
})
//(7)删除文件
fs.unlinkSync('./01txt.txt');
//(8)检测是否存在
console.log(fs.existsSync('./a'));//返回false
//例子:如果文件2.txt不存在,则创建该文件夹
if(!fs.existsSync('./2.txt')){
fs.mkdirSync('./2.txt')
}
//例子:如果文件2.txt存在,则删除该文件
if(fs.existsSync('./2.txt')){
fs.unlinkSync('./2.txt')
}
//(9)拷贝文件
copyFileSync(源文件路径)
if(!fs.existsSync('./2.txt')){
fs.mkdirSync('./2.txt')
}
fs.copyFileSync('./03day01txt.js','./2.txt/2.txt');
//从原文件03day01txt.js拷贝到2.txt/2.txt文件夹下的txt
//4.文件流
//createReadStream() 创建可读取的文件流
//createWriteStream() 创建可写入的文件流
//on(事件名称,回调函数) 添加事件,用于监听事件
//pipe() 管道,可以将读取流添加到写入的流
//5.http协议
//超文本传输协议
//是浏览器和web服务器之间的通信协议
// http模块,用来创建web服务器的模块;通过http模块提供
// 的http.createServer()方法,据能把一台电脑变成web服务器
// 从而对外提供web资源服务
// 注意:每个端口号不能同时被多个web服务占用
// 在实际应用中,URL中的80端口可以被省略
(1)通用头信息
Request URL:请求的URL,要请求的资源
Request Method:请求的方法,对资源的操作方式 分为增删改查
Status Code:响应的状态码
1**:接收到了请求还没做出响应
2**:成功的响应
3**:响应的重定向
4**:客户端请求的错误
5**:服务端的错误
(2)响应头信息
Location:设置要跳转的URL
Content-Type:响应的内容类型,可以解决中文乱码 text/html;charset=utf-8
(3)请求头信息// 创建最基本的web服务器
// 1.导入http模块
const http = require("http");
// 2.创建web服务器实例
http.createServer(function(request, response) {
response.writeHead(200, { 'Content-Type': 'text/plain' });
response.end('Hello World');
}).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
// 3.为服务器实例绑定request时间,监听客户端的请求
// 4.启动服务器
//引入http模块
const http=require('http');
//创建web服务器
const server=http.createServer();
//设置端口,用于访问web服务器
server.listen(45,()=>{
console.log('server running at http://127.0.0.1:45')
})
//请求服务器
//服务器端接受客户端请求并做出响应
//监听事件:一旦有请求进来,立即做出响应
server.on('request',(req,res)=>{
//设置响应的状态码和头信息
res.setHeader('Content-Type','text/html;charset=utf-8')
res.write('这是你的jianbing')
res.end()
res.end(str)
console.log(str)
const str =`您请求的url地址是${req.url},
您请求的类型是${req.method}`
})
//例如:使用http模块创建web服务器,添加事件接受请求作出响应
//“这是首页”
const http=require('http');
const server=http.createServer();
server.listen(60,()=>{
console.log('server running at http://127.0.0.1:60')
})
server.on('request',(req,res)=>{
res.setHeader('Content-Type','text/html;charset=utf-8')
res.wreteHeader()
res.write('这是首页')
// 设置响应的状态码302,跳转到tmocc
res.writeHeader(302,{
Location:'https://www.tmooc.cn/'});
res.end();
//设置状态码为404
res.writeHead(404);
//设置响应的内容
res.write('not found');
res.end();
})