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')
})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值