什么是node.js
node.js是一个基于Chrome V8 引擎的javaScript运行环境.
node.js使用了一个事件驱动,非阻塞式I/O的模型,使其轻量又高效.
node.js的包管理npm,是全球最大的开源库生态系统.
node.js可以解析JS代码(因为是用在服务器端的,所以没有浏览器安全级别的限制),提供了很多系统级别的api,如:
- 文件的读写
- 进程的管理
- 网络通信
npm -包管理工具
npm使用入门
node.js常用模块介绍
URL
url.parse(urlString[,parseQueryString[,slashesDenoteHost]])
- urlString要解析的URL字符串.
- parseQueryString如果设为true,则返回的URL对象的query属性会是一个使用querystring模块的parse()生成的对象.如果设为false,则query会是一个未解析未解码的字符串.默认为false.
- slashesDenoteHost 如果设为 true,则 // 之后至下一个 / 之前的字符串会解析作为 host。 例如, //foo/bar 会解析为 {host: ‘foo’, pathname: ‘/bar’} 而不是 {pathname: ‘//foo/bar’}。 默认为 false。
解析URL字符串并返回URL对象.
如果urlString不是字符串,则抛出TypeError.
如果auth属性存在但无法解码,则抛出URIError.
url.format(urlObject)
- urlObject |一个URL对象(就像url.parse()返回的).如果是一个字符串,则通过url.parse()转换为一个对象.
url.format()方法返回一个从urlObject格式化后的URL字符串.
如果urlObject不是一个对象或字符串,则url.format()抛出TypeError.
格式化过程如下:
- 创建一个新的字符串result.
- 如果urlObject.protocol是一个字符串,则它会被原样添加到result.
- 否则,如果urlObject.protocol不是一个undefined也不是一个字符串,则抛出Error.
- 对于不是以:结束的urlObject.protocol,:会被添加到result.
- urlObject.slashes 属性为真;
- urlObject.protocol 以 http、 https、 ftp、 gopher 或 file 开头;
- 如果 urlObject.auth 属性的值为真,且 urlObject.host 或 urlObject.hostname 不为 undefined,则 urlObject.auth 会被添加到 result,且后面带上 @。
- 如果 urlObject.host 属性为 undefined,则:
- 如果 urlObject.hostname 是一个字符串,则它会被添加到 result。
- 否则,如果 urlObject.hostname 不是 undefined 也不是一个字符串,则抛出 Error。
- 如果 urlObject.port 属性的值为真,且 urlObject.hostname 不为 undefined:
- : 会被添加到 result。
- urlObject.port 的值会被添加到 result。
- 否则,如果 urlObject.host 属性的值为真,则 urlObject.host 的值会被添加到 result。
- 如果 urlObject.pathname 属性是一个字符串且不是一个空字符串:
- 如果 urlObject.pathname 不是以 / 开头,则 / 会被添加到 result。
- urlObject.pathname 的值会被添加到 result。
- 否则,如果 urlObject.pathname 不是 undefined 也不是一个字符串,则抛出 Error。
- 如果 urlObject.search 属性为 undefined 且 urlObject.query 属性是一个 Object,则 ? 会被添加到 result,后面跟上把 urlObject.query 的值传入 querystring 模块的 stringify() 方法的调用结果。
- 否则,如果 urlObject.search 是一个字符串:
- 如果 urlObject.search 的值不是以 ? 开头,则 ? 会被添加到 result。
- urlObject.search 的值会被添加到 result。
- 否则,如果 urlObject.search 不是 undefined 也不是一个字符串,则抛出 Error。
- 如果 urlObject.hash 属性是一个字符串:
- 如果 urlObject.hash 的值不是以 # 开头,则 # 会被添加到 result。
- urlObject.hash 的值会被添加到 result。
- 否则,如果 urlObject.hash 属性不是 undefined 也不是一个字符串,则抛出 Error。
- 返回 result。
resolve(from,to)
- from 解析时相对的基本URL.
- to 要解析的超链接URL.
url.resolve()方法会以一种Web浏览器解析超链接的方式把一个目标URL解析成相对于一个基础URL.
例子:
const url = require('url');
url.resolve('/one/two/three','four');//'/one/two/four'
url.resolve('http://example.com/','/one');// 'http://example.com/one'
url.resolve('http://example.com/one','two');// 'http://example.com/two'
事件
events
使用事件:EventEmitter
事件的参数
只执行一个的事件监听器
实例:
使用on事件时,后面的emit方法会都执行
const EventEmitter = require('events')
class Player extends EventEmitter{}
var player = new Player();
player.on('play',(track)=>{
console.log(`正在播放:<${track}>`)
})
player.emit('play','精绝古城')
player.emit('play','天下无双')
使用once事件时,无论有几个emit,只执行后面第一次emit
const EventEmitter = require('events')
class Player extends EventEmitter{}
var player = new Player();
player.once('play',(track)=>{
console.log(`正在播放:<${track}>`)
})
player.emit('play','精绝古城')
player.emit('play','天下无双')
File System
得到文件与目录的信息:stat
const fs = require('fs') //导入模块
fs.stat('spider.js',(error,stats)=>{
if(error){
console.log(error)
}else{
console.log(stats)
console.log(`文件:${stats.isFile()}`)
console.log(`目录:${stats.isDirectory()}`)
}
})
创建一个目录:mkdir
const fs = require('fs')
fs.mkdir('logs',(error) =>{
if(error){
console.log(error)
}else{
console.log('成功创建目录:logs')
}
})
创建文件并写入内容:writeFile,appendFile
const fs=require('fs')
fs.writeFile('logs/hello.log','修改~\n',(error)=>{
if(error){
console.log(error)
}else{
console.log('成功写入文件')
}
})
fs.appendFile('logs/hello.log','hello~\n',(error)=>{
if(error){
console.log(error)
}else{
console.log('成功写入文件')
}
})
读取文件的内容:readFile
const fs = require('fs')
fs.readFile('logs/hello.log','utf8',(error,data)=>{
if(error){
console.log(error);
}else{
console.log(data.toString());
}
});
列出目录的东西:readdir
const fs = require('fs')
fs.readdir('logs',(error,files)=>{
if(error){
console.log(error);
}else{
console.log(files);
}
})
重命名目录或文件:rename
const fs = require('fs')
fs.rename('logs/hello.log','logs/greeting.log',(error)=>{
if(error){
console.log(error);
}else{
console.log('重命名成功');
}
})
删除目录或文件:rmdir,unlink
const fs = require('fs')
fs.readdirSync('logs').map((file)=>{
fs.unlink(`logs/${file}`,(error)=>{
if(error){
console.log(error)
}else{
console.log(`成功的删除了文件:${file}`)
}
})
})
fs.rmdir('logs',(error)=>{
if(error){
console.log(error)
}else{
console.log('成功的删除了目录:logs')
}
})
Stream
读取文件流
可读流的事件
可写的文件流
pipe链式使用
pipe
const fs = require('fs')
const zlib = require('zlib')//压缩
var fileReadStream = fs.createReadStream('data.json')
var fileWriteStream = fs.createWriteStream('data.json.gz')
fireWriteStream.on('pipe',(source)=>{
console.log(source)
})
fileReadStream
.pipe(zlib.createGzip())
.pipe(fileWriteStream)
// var count = 0;
// fileReadStream.once('data',(chunk)=>{
// console.log(chunk)
// })
// fileReadStream.on('data',(chunk)=>{
// console.log(`${++count}接收到:${chunk.length}`)
// fileWriteStream.write(chunk)
// })
// fileReadStream.on('end',()=>{
// console.log('---结束---');
// })
// fileReadStream.on('error',(error)=>{
// console.log(error);
// })