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