顶层对象
js中的顶层对象是window
node中顶层对象是global 没有window这个概念node的模块化
在node中一个文件就是一个模块 每一个模块都有自己的作用域 每一个模块都是属于当前作用域的而不是全局的 全局的作用域
var a=1;console.log(a) //1global.a=100;console.log(a) //1console.log(global.a) //100
但是在2.js仍然不能使用global.js
每一个模块都有自己的全局 __filename 就会得到文件当前的位置
这就是node 的本身的模块化的机制node加载其他的模块
require("./1.js") 引入1.js这个模块
在加载其他的模块的时候 1、首先按照加载的模块文件名称进行查找2、如果没有找到 在模块文件名称后边加上.js 进行查找3、如果还没有找到 在模块文件名称后边加上.json 进行查找4、如果还没有找到 在模块文件名称后边加上.node 进行查找 如果还没有找到就会报错module 和module.exorts
在一个模块中通过var定义的变量 其作用域范围是当前模块 外部模块是不能够直接访问这个变量 如果我们想让在外边去访问这个模块变量 可以使用
1、全局挂载的方式 把这个变量作为global的属性1.js中global.a=1;
2.js中
require("./1.js")console.log(__filename)console.log(a) //1 访问到了1.js中的a的值
就可以访问到global.a
但是这样的做法是不推介的2、使用模块对象 module对象 每一个模块都会有这个module对象module对象 保存提供和当前模块有关的一些信息 访问这个对象可以得到以下的信息 id: '.', 当前模块的唯一标识 exports: {}, 通过这个对象 将一个模块中的局部变量暴露出来 parent: null, filename: 'G:\gitworkspace\node\2.js', loaded: false, children: [ Module {id: 'G:\\gitworkspace\\node\\1.js', exports: {}, parent: [Circular], filename: 'G:\\gitworkspace\\node\\1.js', loaded: true, children: [], paths: [Object] } ],
paths:
[ 'G:\gitworkspace\node\node_modules','G:\\gitworkspace\\node_modules', 'G:\\node_modules' ] }
在这个module有一个很重要的子对象 exports 对象 可以通过这个对象将模块中的局部对象暴露
1.jsvar a=1;module.exports.a=a;
2.js
var m1=require("./1.js")console.log(m1.a) //就可以输出1了
在模块作用域内 还有一个内置的模块对象 全局的exports 其实就是module.exports
console.log(exports===module.exports) //true但是在使用的过程中需要注意小细节 不要让module.exports的引用断开1.js中
var a=1;module.exports=[1,2,3]; //断开了module.exports的引用exports.a=a;
2.js中
var m1=require("./1.js") //require的返回对象就是1.js模块中的moduleconsole.log(m1.a) //undefined 这里就访问不到了aconsole.log(exports===module.exports)
同时在模块作用域内,还有一个内置的模块对象,exports 他其实就是module.exports 如上
所以在使用模块化的时候 尽量是在module.exports或者exports添加属性 而不是具体的更改引用地址__filename
每一个模块作用域下边都有这样的一个属性 代表的是这个文件所在目录的路径 蛋挞不是全局的属性 只是模块作用域的一个固有的属性
__dirname
返回的是当前文件解析后的绝对路径 不带文件本身 也是模块的固定属性不是global的属性
setInterval函数 clearInterval()setTimeout函数 clearTimeout() 这四个函数都可以使用process全局对象
是global对象的属性 通过对process对象的访问 可以得到访问当前的进程 使我们可以对当前运行的程序的进程进行访问和控制 process对象有如下的属性
stdin stdout 标准输入输出流 默认情况输入流是关闭的 所以使用的时候先开启标准输入设备:键盘 鼠标 摄像头 扫描仪process.stdin.resume();process.stdin.on("data",function (data) { process.stdout.write(data)})
实现了 用户输入什么 回车的时候就会输出什么
标准输出设备:显示器 绘图仪 想控制太输出 process.stdout.write("sas")1、argv 数组 包含命令行参数的数组 会输出[ 'C:\Program Files\nodejs\node.exe', //运行改程序的编译器 'G:\gitworkspace\node\2.js' ] //当前的.js文件2、env会得道用户的运行环境 所以这里也可以看出js操作的是浏览器 node操作的是系统3、version 返回node的版本4、pid返回当前进程的pid5、title返回当前进程显示的名称6、platform 返回操作平台的信息 7、exit()退出这个进程Buffer
一个用于更好的操作二进制数据的类 从文件或输入流中读取内容
使用方法 1、 var buffer=new Buffer(10) //创建一个buffer对象 并为这个对象分配一个大小当我们一个buffer分配空间以后 其长度是固定的 不能更改2、使用数组来新建一个buffer var bb=new Buffer([1,2,3])这种方式声明的buffer的长度也是固定的3、使用字符串声明一个buffer var ss=new Buffer(string,'utf-8');把字符串转化为二进制格式的 将16进制的编码转化为字符 String.fromCharCode()buffer的方法1、buffer的write方法var ss=new Buffer("sasasa");for(var i=0;i
buffer.write(string,[offset] )作用是根据参数offset来指定开始添加字符串的
var ss="miaov"var bf=new Buffer(5);bf.write(ss)console.log(bf) //
但是指定了offset以后
var ss="miaov"var bf=new Buffer(5);bf.write(ss,2)console.log(bf) //
2、buffer.toString() 方法 将buffer转换成字符串
var ss="miaov"var bf=new Buffer(5);bf.write(ss)console.log(bf.toString()) //miaov
var ss="妙味"var bf=new Buffer(ss);console.log(bf) //
所以在node中一个汉字占3个字节
3、buffer.tojson()将buffer中的内容转化为json格式数据4、buffer.slice(start,end)截取buffer中的一部分 但是和原来的老的buffer引用的是一个地址 改变这个新的buffer就会改变原来的5、5、buffer.copy(复制内容到的新区域) 但是这个新区域的引用地址和原来的地址不是同一个地址 所以更改新的区域不会更改原来的buffer6、buffer的静态方法 不需要在实例上边调用的方法 检测 Buffer是否支持某种编码 Buffer.isEncoding('utf-8') 检测是否支持utf-8编码 检测 某个变量是否是Buffer Buffer.isBuffer(变量) Buffer.concat(存着buffer的数组) 返回这个数组内每一个元素拼接好的buffer文件系统 File System
首先要引入 fs模块
1、fs.open方法 异步的方式打开文件 不会阻塞后边代码的执行 通过回调函数对读取结果进行处理fs.open(path,flags,[model],callback)path 所在的路径 flags 打开文件的方式 r读的方式 r+读写方式model 设置文件的模式 读/写/执行 4/2/1callback 当通过open方法以后 调用callback 有两个参数 error fd(文件的标识) 文件的标识是唯一的标识这个文件 以便于后边通过这个编号来操作这个打开的文件 从3开始2、fs.openSync(path,flags) 会阻塞后边代码的执行 通过这个方法返回值对读取结果进行处理3、fs.read(fd,buffer,offset,length,position,callback)fs.open('1.txt','r',function (error,fd) { if(error){ console.log("文件打开失败") } //fs.read(fd,buffer,offset,length,position,callback) //刚才读取成功的文件的唯一标识fd var bf1=new Buffer(10); //offset 新的内容添加到的buffer的起始位置 //length 读取的长度 //position 从文件的哪里开始 //callback 回调函数 的参数error newbf的length newbf新的buffer fs.read(fd,bf1,0,4,null,function (error,len,newbf) { console.log(error) //null console.log(len) //4 console.log(newbf) //})})
4、fs.writeSync() fs的同步版本
5、fs.write(fd,buffer,offset,length,position,callback)buffer 要写入的数据offset buffer对象中要写入的数据起始位置length buffer对象中要写入的数据的长度position fd中的起始位置 文件中开始写的位置callback 回调函数 error buffer的length 写入的buffer
fs.write另一种使用方法 fs.write(fd,'wqds找室内设计师',5,'utf-8')
fs.open('1.txt','w',function (error,fd) { if(error){ console.log("文件打开失败") } else{ var bf=new Buffer('123'); fs.write(fd,bf,0,3,0,function (error,length) { console.log(arguments) }) }})
6、fs.writeSync() buffer的同步的版本
7、fs.close(fd,callback) 文件打开以后 一定要对文件进行关闭以上方法都是在文件打开以才能执行的 下面这些方法自带打开文件的方法8、fs.writeFile(filename,data,[options],callback) 如果文件不存在就回新建一个文件 而不会报错如果文件存在 则新的data会直接覆盖原有的内容var fileName="2.txt";fs.writeFile(fileName,"sasa",function () { })
以上的方法就会新建一个2.txt
9、fs.writeFileSync(filename,data,[options]) 同步版本10、fs.appendFile(filename,data,callback) 异步的向文件写入数据 如果文件不存在就回新建一个文件 而不会报错如果文件存在 则新的data会追加到原有的内容后边当然也有同步版本11、fs.exists(path,callback) 检查指定的目录是否存在 当然也有同步版本12、fs.readFile(fileName,callback) 如果直接输出data 会得到的是一个bufferfs.readFile('1.txt',function (error,data) { if(error){ console.log("读取失败") } else{ console.log(data.toString()) }})
当然也有同步的版本
13、fs.unlink(fileName,callback) 删除这个文件var fileName="2.txt";fs.unlink(fileName,function (error) { if(error){ console.log(error) }})
就会删除2.txt
13、fs.rename(fileName,newName,callback) 14、fs.sat(filename,callback) 会在callback中得到文件的信息15、fs.mkdir(path,[mode],callback) 创建文件夹16、fs.rmdir(path,callback) 删除文件夹node实现web开发-->http模块
客户端发送一个http请求到指定的服务器端->服务器端接受并处理请求->返回数据到客户端
使用http模块就可以搭建一个web服务器 1、这个模块下有一个createServer(回调函数)来创建一个服务器2、服务器调用.listen(端口号,[主机名],[callback]) 来实现监听某一窗口3、server.on(error,callback) 当服务器开启发生错误了 就会触发这个事件5、server.on('listening',callback) 当服务器正式监听的时候就会触发这个事件6、server.on('request',callback) 当有客户端发起请求的时候 就会触发这个事件request这个里边有一个对象IncomingMessage 包含以下的信息得到客户端发送过来的信息 url method responseres.write(data)res.end() 服务器的响应已经发送完成了 必须调用res.writeHead(状态码,描述,头信息) 设置头信息头信息:{‘content-type’:'text/html;charset=utf-8'}text/html 按照html处理 text/plain 告诉客户端按照文本处理
当然如果不希望写在头信息 这一部分的话 也就是上边的那个键值对里边
也可以调用 res.setHeader(key,value)url的处理
通过req得到url req.url
在url中 ?后面的内容叫做查询字符串 在node中有专门处理url的模块 引入url模块var http=require('http');var url=require("url");var server=http.createServer(function (req,res) { var urlString=url.parse(req.url); console.log(urlString) res.write("sasa"); res.end();})server.listen(3000);
在这个urlString中包 协议 主机 端口
hash 哈希值部分#后面的内容 search ?+后面的内容 query ?后面的内容