【NodeJS】模块使用

NodeJS模块使用和其他

一. fs模块

  • fs 模块提供了用于与文件系统进行交互的 API。

  • 使用模块要先导包

    const fs = require('fs');
    
  • 文件系统操作都具有同步和异步的形式

    • 异步的形式总是把完成回调作为其最后一个参数,第一个参数预留给异常。 如果操作被成功地完成,则第一个参数会为 nullundefined

      // 导包
      const fs = require('fs');
      // 调用unlink删除方法
      fs.unlink('./test/hello.txt', (err) => {
          if (err) throw err; // 如果出现异常就抛出异常
          console.log('已成功地删除文件');
      });
      
    • 同步的操作时,发生的异常会立即地抛出,可以使用 try…catch 处理,也可以冒泡

      // 导包
      const fs = require('fs');
      
      try {
          fs.unlinkSync('./test/hello.txt');
          console.log('已成功地删除文件');
      } catch (err) {
          // 处理错误
      }
      
  • fs模块读文件

    const fs = require('fs');
    
    fs.readFile('./test/hello.txt', 'utf-8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    

    readFile(path[, options], callback) 方法读文件

    第一个参数:文件的路径

    第二个参数:可选,读取文件的编码格式

    第三个参数:回调函数

    • 第一个参数:异常
    • 第二个参数:读取到的文件内容
  • fs模块写文件

    const fs = require('fs');
    
    const data = `                  将进酒
                       李白
                君不见黄河之水天上来,
                奔流到海不复回。
                君不见高堂明镜悲白发,
                朝如青丝暮成雪。
                人生得意须尽欢,
                莫使金樽空对月。
                天生我材必有用,
                千金散尽还复来....
    `;
    
    
    fs.writeFile('./test/hello.txt', data, (err) => {
        if (err) throw err;
        console.log('文件已被保存');
    });
    

    writeFile(file, data[, options], callback)方法写文件

    第一个参数:文件的路径

    第二个参数:要写入的内容

    第三个参数:可选,文件的编码格式

    第四个参数:回调函数

    • 写入时会覆盖原有内容
    • 如果没有文件会自动创建
    • 如果没有文件夹会报错

二. 同步异步的区分

  • 同步:

    console.log('正在运行中');
    for(let i = 0; i< 10;i++){
        console.log(i);
    }
    console.log('运行完毕');
    /*
    	执行结果:
    	正在运行中
    	0
    	1
    	2
    	3
    	4
    	5
    	6
    	7
    	8
    	9
    	运行完毕
    */
    
    • 同步的读文件

      console.log('前面的执行');
      const fs = require('fs');
      
      try {
          let data = fs.readFileSync('./test/hello.txt', 'utf-8');
          console.log(data)
      } catch (err) {
          console.log('发生错误');
      }
      
      console.log('后面的执行');
      /*
      执行结果:
      前面的执行
      你好,这是一段测试文字.
      后面的执行
      */
      
  • 异步:

    console.log('前面的执行');
    setTimeout(()=>{
        console.log('定时器执行');
    }, 2000);
    console.log('后面的执行');
    /*
    运行结果:
    前面的执行
    后面的执行
    定时器执行
    */
    
    • 异步的读文件

      console.log('前面的执行');
      const fs = require('fs');
      
      fs.readFile('./test/hello.txt', 'utf-8', (err, data) => {
          if (err) throw err;
          console.log(data);
      });
      console.log('后面的执行');
      
      /*
      运行结果:
      前面的执行
      后面的执行
      你好,这是一段测试文字.
      */
      
  • 同步和异步的区别

    • 同步:自上而下按顺序一个个来,执行完一个才能进行下一个

    • 异步:谁先执行完谁先来。会把异步的都放入一个事件队列(任务队列)中,然后进行事件循环,一直监听当有事件执行完了就输出

    • 程序会先执行同步代码然后去执行异步代码.

    • 例子:

      var t = true;
      
      setTimeout(()=>{
          t = false;
      },1000);
      
      while(t){}
      alert('end');
      

      上面的代码因为先执行同步后执行异步的原因会一直卡在while循环。

三. 相对路径和绝对路径

  • 相对路径是相对于运行框的路径而言的

    // 导包
    const fs = require('fs');
    
    fs.readFile('./test/hello.txt', 'utf-8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    

    这里的路径就是相对路径,以.开始

  • 绝对路径

    const fs = require('fs');
    
    fs.readFile('C:\\Users\\韶音XH\\Desktop\\HTML\\nodejs\\test\\hello.txt', 'utf-8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    

    此路径是绝对路径

    • 为了防止转义要用\\或者/
  • __dirname__filename

    console.log(__dirname); // c:\Users\韶音XH\Desktop\HTML\nodejs\模块使用和其他
    console.log(__filename); // c:\Users\韶音XH\Desktop\HTML\nodejs\模块使用和其他\路径问题.js
    

    __filename: 获取到的是当前文件的绝对路径

    __dirname:获取的是当前文件所在的文件夹的绝对路径

  • 绝对路径更好的写法

    const fs = require('fs');
    // 用__dirname来拼接绝对路径,解决不同客户端的兼容问题
    var filePath = __dirname + '\\test\\hello.txt';
    fs.readFile(filePath, 'utf-8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    

四. 其他模块

1. path模块
  • 要先导入包

    const path = require('path');
    
  • path.join:用来拼接字符串,组成路径

    const path = require('path');
    
    let filePath = path.join(__dirname, 'test','hello.txt');
    
    console.log(filePath);
    // c:\Users\韶音XH\Desktop\HTML\nodejs\模块使用和其他\test\hello.txt 
    
  • 用path.join拼接的路径来读文件

    const fs = require('fs');
    
    var filePath = path.join(__dirname, 'test','hello.txt');
    fs.readFile(filePath, 'utf-8', (err, data) => {
        if (err) throw err;
        console.log(data);
    });
    
2. http模块
  • 用来搭建一个服务器

    // 导入模块
    const http = require('http');
    
    // 创建一个服务器
    const server = http.createServer((require,response)=>{
        // 设置返回给用户看的内容
        response.end('你好,这是一段测试文字');
    })
    
    // 开启服务器
    server.listen(8087,()=>{
        console.log('服务器开启了:8087')
    })
    
    1. 首先要导入模块
    2. 创建一个服务器
    3. 设置返回内容
    4. 开启服务器
  • 如果要返回中文,要设置响应头。不然会乱码

    // 导入模块
    const http = require('http');
    
    // 创建一个服务器
    const server = http.createServer((require,response)=>{
        // 设置返回给用户看的内容
        // 设置响应头
        response.setHeader('Content-Type', 'text/html;charset=utf-8');
        response.end('你好,这是一段测试文字');
    })
    
    // 开启服务器
    server.listen(8087,()=>{
        console.log('服务器开启了:8087')
    })
    

五. 第三方模块的安装和使用

一. 第三方模块安装
  1. 首先新建一个空文件夹,名不要用中文。
  2. 用终端进入文件夹,输入npm init -y 进行初始化
  3. 去npm官网找需要的模块下载,然后就可以按照说明使用了
  • 如果下载时出错可以试试清除缓存再下,命令npm cache clean -f
  • 如果下载慢可以设置淘宝源:npm config set registry https://registry.npm.taobao.org
  • 示例,用Crawler爬网站的title

    var Crawler = require("crawler");
    
    var c = new Crawler({
        maxConnections: 10,
        callback: function (error, res, done) {
            if (error) {
                console.log(error);
            } else {
                var $ = res.$;
                console.log($("title").text());
            }
            done();
        }
    });
    
    c.queue('http://www.baidu.com');
    
  • 扩展: npm i 可以根据paclage.json文件自动下载当前文件里所有包

二. Express模块的使用

可以简单的创建服务器
官网:https://www.expressjs.com.cn/

  • 创建服务器

    // 导入模块
    const express = require('express')
    // 创建服务器
    const app = express()
    
    // 设置返回内容
    app.get('/', function (req, res) {
        // express模块创建服务器用res.send()相应
        res.send('Hello World')
    })
    
    // 开启服务器
    app.listen(8088,()=>{
        console.log('服务器已开启')
    })
    
  • 创建静态服务器

    /**
     * 使用express创建静态服务器
     */
    // 导入模块
    const express = require('express')
    
    // 创建服务器
    const app = express();
    
    // 对外开放访问
    app.use(express.static('www')); 
    
    // 开启服务器
    app.listen(8088, () => {
        console.log('服务器已开启')
    })
    

    app.use(express.static(‘www’));

    此代码可以将www目录下的图片、css文件、html文件等对外开放。直接就可以访问了

  • express实现get接口

     // 导包
    const express = require('express');
    
    // 创建服务器
    const app = express()
    
    // 接口
    app.get('/week',(req, res)=>{
        let arr = ['星期一', '星期二', '星期三', '星期四','星期五']
        let index = Math.floor(Math.random()*3); // 0 1 2
    
        res.send(arr[index])
    })
    
    // 开启服务器
    app.listen(8080,()=>{
        console.log('服务器已开启')
    })
    
  • express返回json文件

    // 接口
    app.get('/dog', (req, res) => {
        // 设置响应内容
        res.send({
            dogName: '哈士奇',
            virtue: '运动量大,爱拆家',
            color: '黑白相间'
        })
    })
    
  • express实现带参数的get接口

    app.get('/getBookName', (req, res) => {
        // 接收数据
        console.log(req.query); 
    
        let allbookName = '';
        switch(req.query.bookName){
            case '三国':
                allbookName = '三国演义';
                break
            case '红楼':
                allbookName = '红楼梦';
                break
            case '西游':
                allbookName = '西游记';
                break
            case '水':
                allbookName = '水浒传';
                break
        }
        // 设置响应内容
        res.send(allbookName)
    })
    
  • express实现post接口

    app.post('/test', (req, res) => {
        res.send('测试post接口');
    })
    

    把get换成post即可,很简单

  • express实现带参数的post接口

    // 导包
    const express = require('express');
    const bodyParser = require('body-parser')
    
    // 创建服务器
    const app = express()
    
    // 转换格式
    app.use(bodyParser.urlencoded({ extended: false }))
    
    // 接口
    app.post('/login', (req, res) => {
        // 用req.body获取参数
        console.log(req.body);
    
        if(req.body.name == 'calamity' && req.body.password == '10086'){
            res.send({
                code:200,
                msg:'登录成功'
            })
        }else{
            res.send({
                code: 400,
                msg: '用户名或密码错误'
            })
        }
        res.send('测试post接口');
    })
    
    // 开启服务器
    app.listen(8080, () => {
        console.log('服务器已开启')
    })
    

    获取post的参数要用第三方模块body-parser用req.body获取参数

  • express实现带传文件的post接口

    // 导包
    const express = require('express');
    const bodyParser = require('body-parser');
    var multer = require('multer');
    
    // 创建服务器
    const app = express()
    
    // 用包创建一个uploads文件夹
    var upload = multer({ dest: 'uploads/' })
    
    // 接口
    app.post('/login', upload.single('usericon'), function (req, res, next) {
        // req.file 是 usericon文件的信息
        // req.body 将具有文本域数据,如果存在的话
    
        res.send('测试post接口');
    })
    
    // 开启服务器
    app.listen(8080, () => {
        console.log('服务器已开启')
    })
    

    post传文件要用第三方模块multer

    • req.file 是 接收文件的信息
    • req.body 将具有文本域数据,如果存在的话
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值