初学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', '写入内容
')
    await writeFile('index.text', '追加内容
')
}

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))
    })
}
原文地址:https://www.cnblogs.com/qxp140605/p/13121556.html