IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Node.js(二) node的核心模块(fs,http,url,path) -> 正文阅读

[网络协议]Node.js(二) node的核心模块(fs,http,url,path)

1. fs 文件操作模:实现 读写文件? ?I/O? input? output

readFile  readdir mkdir rmdir  unlink writeFile appendFile  都是异步的

? ? ? ? 引入fs模块,模块是node内置模块,不要另外安装,直接导入即可

let fs = require('fs');

? ? ? ? 读取文件 fs.readFile('文件路径','文件编码 一般为utf-8',回调函数(err,data)=>{})

// readFile 是一个异步操作;
fs.readFile('./package.json','utf-8',(err,data)=>{
  // 当读取失败的时候 err 才会有内容, 读取成功的时候 err是一个null
  if(!err){
    // 证明读取成功了
    console.log(data)//data是读取的对应的数据;
  }else{
    // 证明读取失败了;
    console.log('失败了',err)
  }
})


let data = fs.readFileSync('./package-lock.json','utf-8');// 同步读取 返回结果是 读取的内容;
// 一旦读取失败 代码就会报错  下边的代码就不再执行了;

? ? ? ? 读取文件夹fs.readdir

fs.readdir('./es6',null,(err,data)=>{
  // 第一个参数是文件夹的路径
  if(!err){
    // 证明读取成功
    console.log(data)// data 是一个数组 数组中的项文件夹中的文件的名字
  }else{
    console.log(err)
  }
})

????????创造文件夹fs.mkdir

fs.mkdir('./mydir',(err)=>{
  // 创造文件夹  上边这个参数的意思 就是 在同级目录下创建一个mydir的文件夹
  // 若要创建的文件夹已经存在 那么 再去创建的时候 就会报错失败
  if(!err){
    console.log('创建成功')
  }else{
    console.log('创建失败',err)
  }
})
fs.mkdir('./js/mydir2',(err)=>{
  // 创造文件夹  上边这个参数的意思 就是 在统计目录下的js文件夹下创建一个mydir2的文件夹
  if(!err){
    console.log('创建成功')
  }else{
    console.log('创建失败',err)
  }
}) 

? ? ? ? 删除文件夹fs.rmdir

fs.rmdir('./mydir',(err)=>{
  if(!err){
    console.log('删除成功')
  }else{
    // 删除一个不存在的文件夹时 报错
    console.log('删除失败',err)
  }
}) 

fs.rmdir('./es6',(err)=>{
  // 文件夹若不为空 则删除失败
  console.log(err)
})

fs.unlink('./mytest/1.txt',(err)=>{
  // 删除文件
  console.log(err)
})

? ? ? ? 写入文件fs.writeFile

 fs.writeFile('./mytest/1.txt','hello 珠峰','utf-8',(err)=>{
  // 写入的时候 若发现不存在对应的文件 则会默认创建一个对应的文件
  // 有对应的文件 就会直接写入;
  // 写入的内容会把老内容整个替换掉
  if(!err){
    console.log('写入成功')
  }else{
    console.log('写入失败')
  }
})

? ? ? ? 在文件中添加内容

fs.appendFile('./mytest/2.txt','hello 珠峰','utf-8',(err)=>{
  // 参数等同于 writeFile  但是 这个方法是添加内容 不是替换内容;
  console.log(err)
})

使用Promise来封装这些方法

let fs = require('fs');
let obj = {
  // readFile,readdir
};
['readFile','readdir'].forEach(key=>{
  obj[key] = function(url,encoding=null){
    // 需要 对 encoding 进行判断处理; 若是 js css html txt json 等这类文件的
    // encoding 需要时 utf-8; 其他的 是null即可
    if(/\.(js|css|html|txt|json)/i.test(url)){
      encoding = 'utf-8'
    }
    return new Promise((res,rej)=>{
      fs[key](url,encoding,(err,data)=>{
        if(!err){
          res(data)
        }else{
          rej(err)
        }
      })
    })
  }
});
// mkdir  rmdir  unlink
// writeFile  appendFile
['mkdir','rmdir','unlink'].forEach(key=>{
  obj[key] = function(url){
    return new Promise((res,rej)=>{
      fs[key](url,(err)=>{
        if(!err){
          res('success')
        }else{
          rej(err)
        }
      })
    })
  }
});
['writeFile','appendFile'].forEach(key=>{
  obj[key]=function(url,data,encoding='utf-8'){
    return new Promise((res,rej)=>{
      fs[key](url,data,encoding,(err)=>{
        if(!err){
          res('success')
        }else{
          rej(err)
        }
      })
    })
  }
});

console.log(obj)
module.exports = obj;

2.url 解析url使用

????????引入url模块

let url = require('url');

? ? ? ? url.parse

let str = 'https://www.baidu.com/qqq?w=123&x=abc&name=baidu#hash';
console.log(url.parse(str)) // 里边的query是前端传给后台的 search部分; query只是一个字符串
console.log(url.parse(str,true))// 这时的 query就变成了一个对象;
console.log(url.parse(str,true).query.name)

?3.path?主要用来处理路径问题

????????引入path模块

let path = require('path');

????????path.resolve

console.log('resolve结果:',path.resolve('./qqq','www'));// 根据当前路径和参数 
拼接出参数的绝对路径 C:\Users\T\Desktop\WebstormProjects\untitled\js\node\qqq\www

????????path.join

console.log('join结果:',path.join('./qqq','www','eee'));// 参数拼接成路径 qqq\www\eee
console.log('join__dirname:',path.join(__dirname,'qqq','www'))

4.http?是一个起服务的模块

????????引入http模块

let http = require('http');

? ? ? ? http基础用法

    let http = require('http');
    http.createServer(()=>{

    }).listen(端口号,()=>{
      
    })

? ? ? ? ?http定义接口

文档结构:static中保存的是静态页面结构,index.html文档引入了css,js文件,所以要想在页面展示完整的静态页面,所以处理html,还会请求其所引入的css和js文件

?

let http = require('http');
let { readFile } = require('./js/promiseFs.js');
let url = require('url');
http.createServer((request, response) => {
  // 前端向我们后端发送请求的时候 会执行这个回调函数;
  //request 存放的是请求信息
  //response 存放的是响应信息;

  // 若想在前端展示页面 则 前端 请求内容时 我们给前端 html文档
  // 需要我们后端把html文档读出来 然后发给前端;
  // readFile('./static/index.html').then(data => {
  //   // data 就是 读出来的html文档的内容;
  //   response.end(data); 响应,想前端发送响应的数据
  // })
  // 真实情况应该是 前端要什么文件 我们给什么文件 
  console.log(request.url)// 前端的请求路径; 根据这个 我么你来判断给前端什么内容
  switch (request.url) {
    case '/':
      readFile('./static/index.html').then(data => {
         // 这是前端给后端的响应 参数就是响应信息
        // data 就是 读出来的html文档的内容;
        response.end(data);
      })
      break;
    case '/index.css':
      readFile('./static/index.css').then(data => {
        response.end(data)
      })
      break;
    case '/index.js':
      readFile('./static/index.js').then(data => {
        response.end(data)
      })
      break;
    case '/result.png':
      readFile('./static/result.png').then(data => {
        response.end(data)
      })
      break;
    case '/favicon.ico':
      readFile('./static/favicon.ico').then(data => {
        response.end(data)
      })
      break;
    default:
      response.end('666')
      break;
  }

}).listen(8889, function () {
  console.log('服务启动成功 端口是8889')
})

精简一下上面的代码

let http = require('http');
let { readFile } = require('./js/promiseFs.js');
let url = require('url');// 专门用来解析路径的;
http.createServer((request, response) => {
  // console.log(request.url)
  // console.log(url.parse(request.url,true))
  let {pathname} = url.parse(request.url,true);//pathname 这个属性 是不带 参数的
  if(pathname == '/'){
    readFile('./static/index.html').then(data => {
      // data 就是 读出来的html文档的内容;
      response.end(data);
    }).catch(err=>{
      // 若后端出现问题 则 返回前端500的错误
      response.statusCode = 500;
      response.statusMessage = 'hahaha';
      response.end('error');
    })
  }else{
    readFile('./static'+pathname).then(data => {
      response.end(data)
    }).catch(err=>{
      // 若后端出现错误 则 返回前端404的错误
      console.log(err)
      response.statusCode = 444;
      response.statusMessage = 'not found';
      response.end('error');
    })
  }

}).listen(8889, function () {
  console.log('服务启动成功 端口是8889')
})

接下来实现前端页面想后端请求数据

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link rel="stylesheet" href="./index.css?qweqew">
  <link rel="stylesheet" href="./css/1.css">
</head>
<body>
  <h1>哈哈哈</h1>
  <img src="./result.png?ergdgd" alt="">
  <img src="./favicon.ico?dgdgdg" alt="">

  <input type="text" id='todo'>

  <button id='btn'>按钮</button>

  <ul id='ul'>
    <li>12313</li>
  </ul>


  <script src="./index.js?ergdgdgd"></script>
  <script src="./index2.js"></script>
</body>
</html>

index.js

let btn = document.querySelector('#btn');
点击按钮后发送ajax请求,将input框中的数据添加到后端的数据中
btn.onclick = function(){
    // todo input标签的id
  let val = todo.value;
  todo.value = '';
  let xhr = new XMLHttpRequest;
    // 将input中的值当作url中的参数传递,添加到list的数据中
  xhr.open('get','/add?val='+val);
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200){
      console.log(xhr.response)
        // 数据改变后重新获取数据
      render();
    }
  }
  xhr.send();
}

发送ajax请求list中的数据
function render(){
  let xhr = new XMLHttpRequest;
  xhr.open('get','/list');
  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200){
      let str = '';
      let ary = JSON.parse(xhr.response);
      ary.forEach(item=>{
        str += `<li>${item}<button>X</button></li>`
      })
      ul.innerHTML = str;
    }
  }
  xhr.send();
}
render();

后端实现

let http = require('http');
let { readFile,writeFile } = require('./js/promiseFs.js');
let url = require('url');// 专门用来解析路径的;
http.createServer((request, response) => {
  // console.log(request.url)
  // console.log(url.parse(request.url,true))
  let {pathname,query} = url.parse(request.url,true);//pathname 这个属性 是不带 参数的
  // console.log(query)
  if(pathname == '/'){
    readFile('./static/index.html').then(data => {
      // data 就是 读出来的html文档的内容;
      response.end(data);
    }).catch(err=>{
      // 若后端出现问题 则 返回前端500的错误
      response.statusCode = 500;
      response.statusMessage = 'hahaha';
      response.end('error');
    })
  }else{
    // 当前端的请求路径是/list的时候 我们后端要把data/list.json 中的内容返给前端;
    // 路径行带后缀的 我们正常读取staic中的内容
    // 我们请求list 是不带后缀的 我们去data文件夹中获取
    if(/\.\w+/.test(pathname)){
      // 有后缀的
      readFile('./static'+pathname).then(data => {
        response.end(data)
      }).catch(err=>{
        console.log(err)
        response.statusCode = 444;
        response.statusMessage = 'not found';
        response.end('error');
      })
    }else{
      // 当前端 调用 add接口时  我们后端 1 怎么获取前端传递的参数 ?
      // 2 拿到传递的参数之后 怎么写入到list.json中?
      switch (pathname) {
        case '/add':
          // console.log(query.val)// 可以获取前端传递的参数
          // response.end('666')
          readFile('./data/list.json').then(data=>{
            // data 是读取到的json文件中的数据 是一个json字符串
            data = JSON.parse(data);//把data从字符串转成了数组
            data.push(query.val);// query.val获取url中的参数,是一个对象,再把修改之后的数组写入到JSON文件中
            writeFile('./data/list.json',JSON.stringify(data)).then(data=>{
              // 走到这里才是写入成功了
                // response.end 返回的必须是一个字符串
              response.end(JSON.stringify({
                code:0,
                msg:'你成功了'
              }))
            }).catch(err=>{
              console.log(err);
              
            })
          })
          break;
        case '/list':
          readFile('./data'+pathname+'.json').then(data=>{
            response.end(data)
          })
          break;
        default:
          break;
      }
      
    }
    
  }

}).listen(8889, function () {
  console.log('服务启动成功 端口是8889')
})

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-10-02 15:11:36  更:2021-10-02 15:12:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年9日历 -2024/9/29 8:02:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码