Node.js基础学习

145 阅读3分钟

Node.js

一、模块导入与导出

  • 导入require
  • 导出module.exports={}

二、模块路径解析规则

  • require(/index.js)在文件根路径找
  • require(./index.js)相对路径
  • require('express')先看是不是内置模块,然后在nodeo_modules找,在上一级的node_modules找,一层一层往上找

三、初始化node包

npm init -y

四、fs文件模块

1.文件同步写入

const fs = require('fs');
// 打开文件
const fd = fs.openSync('test1.txt','w')
// 写入文件
fs.writeFileSync(fd, '你好,Nodejs')
// 退出文件
fs.closeSync(fd)

2.文件异步写入

const fs = require('fs');
// 打开文件
fs.open('test2.txt','w',(err,fd)=>{
  console.log('打开文件');
  // 写入文件
  fs.writeFile(fd, '你好,Nodejs。',(err)=>{
    if(!err){
      console.log('写入完成');
      // 退出文件
      fs.close(fd,()=>{
        console.log('文件关闭完成');
      })
    }
  })
})

3.文件流写入

const fs = require('fs');

// 创建写入流
const ws = fs.createWriteStream('text3.txt');
// 监听通道打开
ws.once('open',()=>{
  console.log('通道打开');
  ws.write('你吃了吗')
  ws.write('你喝了吗')
  ws.write('你饱了吗')
  // 写入结束
  ws.end()
})
// 监听通道关闭
ws.once('close', () => {
  console.log('通道关闭');
})

4.文件读取

const fs = require('fs');
fs.readFile('text3.txt',(err,data)=>{
  if(!err){
    console.log(data.toString());
  }else{
    console.log('err',err);
  }
})

4.读取流

const fs = require('fs');
const rs = fs.createReadStream('text3.txt');
const ws = fs.createWriteStream('text5.txt');
// 创建管道,将读取流通过管道流出
rs.pipe(ws)

5.删除文件

const fs = require('fs');
// 删除文件
fs.unlink('demo.txt',(err)=>{
  if(err){
    console.log(err);
  }else{
    console.log('删除文件成功');
  }
})

6.读取目录下的所有文件

const fs = require('fs');

fs.readdir('./',(err,files)=>{
  if(err){
    console.log(err);
  }else{
    console.log(files);
  }
})

7.创建目录

const fs = require('fs');

// 创建文件夹
fs.mkdir('./img',(err)=>{
  if (err) {
    console.log(err);
  } else {
    console.log('创建成功');
  }
})

8.删除空目录

const fs = require('fs');

//删除文件夹
fs.rmdir('./img',(err)=>{
  if (err) {
    console.log(err);
  } else {
    console.log('删除成功');
  }
})

9.递归删除非空目录

const fs = require('fs');

function delDir(dirPath) {
  let filesArr = fs.readdirSync(dirPath);
  for (let i in filesArr) {
    let filePath = dirPath + '/' + filesArr[i];

    // 读取文件信息
    let stat = fs.statSync(filePath);
    // 判断是文件还是目录
    if (stat.isFile()) {
      fs.unlinkSync(filePath)
    } else if (stat.isDirectory()){
      // 递归调用自己
      delDir(filePath);
    }
  }

  //删除空目录
  fs.rmdirSync(dirPath)
}

delDir('./img')

四、自定义node事件

const events = require('events');

// 创建事件对象
let eventLog = new events.EventEmitter();
// 监听事件
eventLog.on('lpMkDir',(msg)=>{
  console.log('lp创建目录事件触发',`msg:${msg}`);
})
// 触发
eventLog.emit('lpMkDir','芜湖,起飞')


五、buffer缓冲区,用于读取或操作二进制数据流

// 将字符串放置到缓冲区
const b1 = Buffer.from('10')
console.log(b1,b1.toString());

// 初始化缓冲区,创建一个大小为10个字节的缓冲区
// 保证新创建的缓冲区数据是不会包含旧的数据
const b2=Buffer.alloc(10);
console.log(b2);

// 不回重置数据,不安全
const b3 =Buffer.allocUnsafe(10);
console.log(b3);

b3[0]='1'
console.log(b3, b3[0].toString());


六、多进程

exec

const child_process = require('child_process');

for (let i = 0; i < 3; i++) {

  // stdout子进程输出的结果
  // stderr子进程输出的错误
  let workProcess = child_process.exec('node main1.js '+i,(err,stdout,stderr)=>{
    if(err){
      console.log(err);
    }else{
      console.log('stdout:',stdout);
      console.log('stderr:',stderr);
    }
  })

  workProcess.on('exit',(code)=>{
    console.log('子进程已退出,退出码: '+code);
  })
}

spawn

const child_process = require('child_process');

for (let i = 0; i < 3; i++) {

  // stdout子进程输出的结果
  // stderr子进程输出的错误
  let workProcess = child_process.spawn('node',['main1.js',i]);

  workProcess.stdout.on('data', (data) => {
    console.log('data: ' + data);
  })

  workProcess.stderr.on('err', (err) => {
    console.log('err: ' + err);
  })

  workProcess.on('close',(code)=>{
    console.log('子进程已退出,退出码: '+code);
  })
}

fork

const child_process = require('child_process');

for (let i = 0; i < 3; i++) {

  // stdout子进程输出的结果
  // stderr子进程输出的错误
  let workProcess = child_process.fork('main1.js',[i]);

  workProcess.on('close',(code)=>{
    console.log('子进程已退出,退出码: '+code);
  })
}

path

// 当前正在执行的脚本的文件名称
console.log(__filename);

// 当前正在执行脚本的目录名称
console.log(__dirname);

const path = require('path');

// 获取文件扩展名
console.log(path.extname(__filename));

// 获取文件名称
console.log(path.basename(__filename));

// 获取目录名称
console.log(path.dirname(__filename));

// 路径解析和规范化
console.log(path.normalize(__filename));

// 路径拼接
console.log(path.join(__dirname+'/lp.jpg'));

// 获取绝对路径的合并
console.log(path.resolve(__dirname + '/lp.jpg'));

HTTP模块搭建简易服务器

// 导入http模块
const http = require('http');
// 创建服务器实例
const serve = http.createServer();
// 监听请求
serve.on('request', (req, res) => {
  console.log(req.url);
  if(req.url=='/'){
    res.end('index')
  }else if(req.url=='/login'){
    res.end('login')
  }else{
    res.end('not found')
  }
})

// 绑定监听端口号

serve.listen(3000, () => {
  console.log('服务器端口号:', 3000);
})

express搭建静态服务器和自定义接口

// 导入express框架
const express = require('express');

// 实例化服务器应用
const app = express();

// 实现静态服务器
app.use(express.static('static'));

// 实现自定义接口
app.get('/api/userList', (req, res) => {
  // 请求的信息:req对象
  // 响应的信息:res对象
  res.json({
    code: 'ok',
    userList: [
      {
        username: '小明',
        sex: '男'
      },
      {
        username: '小白',
        sex: '男'
      },
      {
        username: '小黑',
        sex: '女'
      }
    ]
  })
})

// 启动服务器
app.listen(3000, () => {
  console.log('服务器端口号: ', 3000);
})