初学node
1.每个js文件视为一个模块
导出: let study = { name: 'jj', age: 18 } module.exports = study (也可直接exports = study) 导入: let study= require('./index.js')
2.文件模块
2.1.文件内容读取
let fs = require('fs') // 引入文件模块
// 读写文件也有同步和异步的借口
// 读取文件
// 1.同步
let content = fs.readFileSync('index.text', { flag: 'r', encoding: 'utf-8' })
// console.log(content)
// 2.异步
// let content1 = fs.readFile('index.text', { flag: 'r', encoding: 'utf-8' }, (err, data) => {
// if (err) throw err
// console.log(data)
// })
// 2.1promise 封装
function readFile(url) {
return new Promise((resolve, reject) => {
fs.readFile(url, { flag: 'r', encoding: 'utf-8' }, (err, data) => {
err ? reject() : resolve(data)
})
})
}
readFile('index.text').then(res => {
console.log(res)
})
2.2.文件内容写入
let fs = require('fs') // 引入文件模块
// 1.写入
// fs.writeFile('index.text', '写入内容', { flag: 'w', encoding: 'utf-8' }, err => {
// console.log(err ? 'err' : 'success')
// })
// 封装一个写入和追加的方法
function writeFile(url, text, type) { // type-write/append
return new Promise((resolve, reject) => {
fs.writeFile(url, text, { flag: type === 'write' ? 'w' : 'a', encoding: 'utf-8' }, err => { // flag默认值 write-w read-r append-a
err ? reject() : resolve()
})
})
}
async function write() {
await writeFile('index.text', '写入内容\n')
await writeFile('index.text', '追加内容\n')
}
write().then(res => console.log('success'))
2.3.文件删除
fs.unlink('index.text', () => console.log('success'))
2.4.读取文件目录
let fs = require('fs') // 引入文件模块
// 读取目录
fs.readdir('../day1', (err, files) => {
console.log(files)
})
// 删除目录
fs.rmdir(path, callback)
//创建目录
fs.mkdir(path, callback)
2.5.输入输出
let readline = require('readline') // 引入
// 创建readline接口实例
let rl = readline.createInterface({
input: process.stdin,
output: process.stdout
})
// question方法
rl.question('what`t your name ?', answer => {
console.log(answer)
rl.close()
})
// 监听close
rl.on('close', () => process.exit()) // 结束进程
2.6.stream(文件流)
const fs = require('fs')
// 1.创建写入流
const writer = fs.createWriteStream('home.txt', { flags: 'w', encoding: 'utf-8' })
// 监听打开
writer.on('open', () => { })
// 监听关闭
writer.on('close', () => { })
// 写入
writer.write('hello', (err) => { })
// 文件写入完成
writer.end(() => { })
// 2.创建读取流
const reader = fs.createReadStream('index.txt', { flags: 'r', encoding: 'utf-8' })
// 监听打开
reader.on('open', () => { })
// 监听关闭
reader.on('close', () => { })
// 监听每一次数据流入完成
reader.on('data', chunk => {
console.log(chunk)
})
// 3.通过管道 将读取到的流写入文件
reader.pipe(writer)
3.events(node事件)
const EventEmitter = require('events') // 引入事件模块
class MyEmitter extends EventEmitter { }
// 创建事件
const myEmitter = new MyEmitter()
// 注册监听事件
myEmitter.on('event', data => {
console.log('触发事件1', data.name)
})
myEmitter.on('event', data => {
console.log('触发事件2', data.name)
})
myEmitter.on('event', data => {
console.log('触发事件3', data.name)
})
// 触发事件
myEmitter.emit('event', { name: 'lili' })
4.path(路径模块)
const path = require('path')
// 返回 path 的扩展名
const ex = path.extname('https://news.baidu.com') // .com
// 将路径或路径片段的序列解析为绝对路径
const re = path.resolve(...['/目录1/目录2', './目录3']) // F:\目录1\目录2\目录3
console.log(__dirname) // 获取当前执行文件所在目录的完整目录名
console.log(__filename) // 获取当前执行文件的带有完整绝对路径的文件名
// 回一个对象,其属性表示 path 的有效元素。 尾部的目录分隔符会被忽略
const pa = path.parse('/目录1/目录2/文件.txt')
// {
// root: '/',
// dir: '/目录1/目录2',
// base: '文件.txt',
// ext: '.txt',
// name: '文件'
// }
5.os(操作系统)
const os = require('os')
const cp = os.cpus() // 返回一个对象数组,其中包含有关每个逻辑 CPU 内核的信息
const tm = os.totalmem() // 以整数的形式返回系统的内存总量(以字节为单位)
const info = os.userInfo() // 返回关于当前有效用户的信息
6.url
const url = require('url')
const myUrl = url.parse('https://sale.vmall.com/618.html?cid=10618')
// {
// protocol: 'https:',
// slashes: true,
// auth: null,
// host: 'sale.vmall.com',
// port: null,
// hostname: 'sale.vmall.com',
// hash: null,
// search: '?cid=10618',
// query: 'cid=10618',
// pathname: '/618.html',
// path: '/618.html?cid=10618',
// href: 'https://sale.vmall.com/618.html?cid=10618'
// }
const yourUrl = url.resolve('http://www.baidu.com/', './you/index.html') // http://www.baidu.com/you/index.html
7.爬取数据
const axios = require('axios')
const fs = require('fs')
// const targetUrl = 'https://www.dytt8.net/index.htm'
const targetUrl = 'https://www.1905.com/vod/?fr=vodplay_menu_vodhome'
axios.get(targetUrl).then(res => {
// console.log(res)
// console.log(res.headers)
// 解析html内容
let reg = /<div class="f20">(.*?)<ul class="fl f15 center_a rec_channel">/igs,
content = reg.exec(res.data)[1],
reg1 = /<a href="(.*?)" target="_blank" title="(.*?)">(.*?)><\/a>/igs,
films = []
while (res = reg1.exec(content)) {
films.push({
name: res[2],
url: res[1]
})
}
store(films)
// console.log(films)
})
async function mkdir(path) {
return new Promise((resolve, reject) => {
fs.mkdir(path, () => resolve())
})
}
async function write(path, text) {
return new Promise((resolve, reject) => {
fs.writeFile(path, text, {}, () => resolve())
})
}
async function store(arr) {
await mkdir('movies')
arr.forEach(item => {
write(`movies/${item.name}.json`, JSON.stringify(item))
})
}

浙公网安备 33010602011771号