zoukankan      html  css  js  c++  java
  • 2.node基础知识笔记

    1.Node.js Buffer(缓冲区)

    JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。

    但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。

    • 实例化

      • Buffer.from(array)

      • Buffer.from(string)

      • Buffer.alloc(size)

    • 功能方法(静态方法:通过类名调用.)

      • Buffer.isEncoding() 判断是否支持该编码

      • Buffer.isBuffer() 判断是否为Buffer

      • Buffer.byteLength() 返回指定编码的字节长度,默认utf8

      • Buffer.concat() 将一组Buffer对象合并为一个Buffer对象

    • 实例方法

      • write() 向buffer对象中写入内容

      • slice() 截取新的buffer对象

      • toString() 把buf对象转成字符串

      • toJSON() 把buf对象转成json形式的字符串:

        不需要显式调用,当JSON.stringify()方法调用时会自动调用toJSON方法。

        let buf=Buffer.from('hello');
        let json=JSON.stringify(buf);
        console.log(json);

    2.核心模块API

    先引入路径模块:

    const path=require('path');

    1. 路径操作:
    • [path.basename(path, ext]):返回文件名称

    • path.dirname(path):返回路径

    • path.extname(path):返回扩展名

    • path.format(pathObject):将一个pathObject转化为一个字符串路径

    • path.parse(path):将一个字符串路径转化为路径对象

    • path.isAbsolute(path):判断是否为一个绝对路径。

    (2)blobal超全局对象下的两个方法:

    • __dirname:返回当前文件所在位置的目录;

    • __filename:返回当前文件所在位置的全路径.

     


    1. // 拼接路径(..表示上层路径;.表示当前路径),在连接路径的时候会格式化路径
      // console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '../../'));

      // 规范化路径
      // console.log(path.normalize('/foo/bar//baz/asdf/quux/..'));
      // console.log(path.normalize('C:\temp\\foo\bar\..\'));

      // 计算相对路径
      // console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
      // console.log(path.relative('C:\orandea\test\aaa', 'C:\orandea\impl\bbb'));

      // 解析路径
      // console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'));

      // 两个特殊属性
      console.log(path.delimiter);//表示路径分隔符(windows是 Linux是/)
      console.log(path.sep);//环境变量分隔符(windows中使用; linux中使用:)
    2. 异步与同步:

      于是,所有任务可以分成两种,一种是同步任务(synchronous),另一种是异步任务(asynchronous)。同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有等主线程任务执行完毕,"任务队列"开始通知主线程,请求执行任务,该任务才会进入主线程执行。

      js在浏览器中执行存在的异步操作: 定时任务 事件处理 ajax回调处理。

      node.js 中的异步执行任务:文件I/O 网络I/O

    2.文件操作:
    1. 引入模块: const fs=require('fs');

    2. fs.stat(param1,param2)

      param1:文件路径 param2: 回调函数 ( err,stats)两个参数都为对象,stats.isDirectory:判断是否为路径

      stats.isFile:判断是否为文件。 属性:ctime:文件状态发生改变时间,如权限 mtime:数据改变时间 atime:访问时间 birthtime:文件创造时间。

    return null3.readFile()和writeFile();


    /*读文件操作*/
    const fs=require('fs');
    const path=require('path');
    let strpath=path.join(__dirname,'data.json');
    /*异步方式*/
    fs.readFile(strpath,(err,data)=>{
        if(err) return;
        console.log(data.toString());
    });
    /*同步方式*/
    console.log(fs.readFileSync(strpath).toString());
    /*写文件操作*/
    let buf=Buffer.from('hello');
    fs.writeFile(strpath,buf,'utf8',(err)=>{
          if(!err){
          console.log('写入成功');
          }
    })

    4.大文件的流式操作:


    /*大文件的流式操作*/
    const path=require('path');
    const fs =require('fs');

    let spath =path.join(__filename);
    let endPath=path.join('C:\Users\Administrator\Desktop','file.js');
    let readStream=fs.createReadStream(spath);
    let writeStream=fs.createWriteStream(endPath);
    /*基于事件的处理方式*/
    /*let num=0;
    chunk:数据块
    readStream.on('data',(chunk)=>{
    num++;
    writeStream.write(chunk);
    });
    readStream.on('end',()=>{
    console.log('文件处理完成'+num);
    });
    */
    // pipe():直接将输入流连接到输出流 pipe:管道
    readStream.pipe(writeStream);
    3.目录结构:

    /*目录操作*/
    const path=require('path');
    const fs=require('fs');

    /*创建目录*/
    // fs.mkdir(path.join(__dirname,'abc'),(err)=>{
    //   console.log(err);
    // });
    /*同步创建目录*/
    // fs.mkdirSync(path.join(__dirname,'def'));

    /*删除目录*/
    // fs.rmdir(path.join(__dirname,'def'),(err)=>{})

    //读取目录
    fs.readdir(__dirname,(err,files)=>{
    files.forEach((item,index)=>{
    fs.stat(path.join(__dirname,item),(err,stat)=>{
    if(stat.isFile()){
    console.log(item+"文件");
    }else if(stat.isDirectory()){
    console.log(item+"目录");
    }
    });
    });
    });
    4.包:
    1. npm: node.js package management (全球最大的模块生态系统,也是node.js的包管理工具。)

    2. npm全局安装(安装包在node.js环境的modules目录下,一般用于命令行工具)

      • 安装包: npm install -g 包名称@版本 (全局安装) 本地安装则不需要 参数 g

      • 更新包 npm update 包名称

      • 删除包: npm uninstall 包名称

      • npm清除缓存:pm cache clean --force

    3.npm本地安装:

    ​ 初始化包 npm init -y (1) 运行 node (2)指定pakage.json中test值 npm run test 执行

    • 添加依赖 : 开发环境 安装包的同时 末尾加上 --save

    • 生产环境:安装包的同时 末尾加上 --save-dev

    • 已有package.json中的dependencies 安装直接 npm install production

      已有DevDependencies 安装直接 npm install

    4.yarn工具的安装:


    ​ yarn工具基本使用


    安装yarn工具:npm install -g yarn

    1、初始化包
    npm init
    yarn init
    2、安装包
    npm install xxx --save
    yarn add xxx
    3、移除包
    npm uninstall xxx
    yarn remove xxx
    4、更新包
    npm update xxx
    yarn upgrade xxx
    5、安装开发依赖的包
    npm install xxx --save-dev
    yarn add xxx --dev
    6、全局安装
    npm install -g xxx
    yarn global add xxx
    7、设置下载镜像的地址
    npm config set registry url
    yarn config set registry url
    8、安装所有依赖
    npm install
    yarn install
    9、执行包
    npm run
    yarn run

    5.自定义包:

    如果严格按照规范来说 包目录应包含以下文件或目录

    • package.json:包描述文件

    • bin:存放可执行二进制文件的目录

    • lib:存放js代码的目录

    • doc:存放文档的目录

    • test:存放单元测试用例代码的目录

    5.node.js实现简单服务器:

    (1)区别:


    传统的动态网站开发需要应用软件
    PHP : Apache + php模块
    java :Tomcat 、Weblogic
    Node.js : 不需要应用软件(可以自己实现)

    (2)


    /*简单实现服务器功能*/
    const http=require('http');

    // 创建服务器实例对象
    let server=http.createServer();
    /*绑定请求事件*/
    server.on('request',(req,res)=>{
    res.end('hello');
    });
    // 监听端口号
    server.listen(3000);
    // 简单写法:
    http.createServer((req,res)=>{
      res.end('welcome to this');
    }).listen(3000,'192.168.229.1',()=>{
    console.log('running...');
    });


    - 处理get方式请求参数:

    - ```javascript
    • 处理get请求方式参数:


      (1) const url=require('url');
      (2) let param=url.parse(req.url,true).query

    • 处理post方式参数:

      1. const querystring = require('querystring');


      2. let pdata='';
        req.on('data',(chunk)=>{
           pdata+=chunk;
        });
        req.on('end',()=>{
           //定义一个存放post发送请求请求体内容的对象。
           let obj=querystring.parse(pdata);
        })

     

    1. art-template的使用:


      /*art-template的使用*/

      var template = require('art-template');
      /*第一种使用方法*/
      /*var html = template(__dirname + '/mytpl.art', {
        user: {
            name: '汪龙',
            age:'18',
            hometown:"lantian"
        }
      });

      console.log(html);*/
      /*方法2*/
      let tpl =`{{if user}}
       <h2>{{user.name}}</h2>
       <h2>{{user.age}}</h2>
       <h2>{{user.hometown}}</h2>
      {{/if}}'`;
      let tpl2=`
      <!DOCTYPE html>
      <html lang="en">
      <head>
      <meta charset="UTF-8">
      <title>成绩结果</title>
      </head>
      <body>
      <ul>
      <li>语文:{{chinese}}</li>
      <li>数学:{{math}}</li>
      <li>英语:{{english}}</li>
      <li>综合:{{summary}}</li>
      </ul>
      </body>
      </html>`;
      let render=template.compile(tpl);

      let ret=render({
      user: {
             name: '汪龙',
             age:'18',
             hometown:"lantian"
        }
      });
      console.log(ret);
      // 方法3
      let score= template.render(tpl2,{
      chinese:'148',
      math:'149',
      english:'139',
      summary:'289'
      } );
      console.log(score);
    • node.js web开发相关内容总结:


      1.nodejs不需要第三方软件,可以自己实现服务器功能。
      2.实现静态资源分配
      3.路由处理
      4.动态网站
      5.模板引擎
      6.get和post参数处理

      web开发框架:express.
    6.express框架:
    • 实现简单服务器测试


      /*express测试*/
      const express=require('express');
      const app=express();

      let server=app.get('/',(req,res)=>{
      res.send('hello world');
      });
      server.listen(3000,'localhost',()=>{
      console.log('running...');
      });
    • 静态文件托管:


    /*托管静态文件*/
    // 可以指定虚拟目录
    // 可以指定多个目录
    var express = require('express');
    var app = express();

    app.use(express.static('public'));
    app.use(express.static('www'));
    app.listen(3000,()=>{
    console.log('running....');
    });
    • 路由处理:


      /*路由(根据请求方式和请求路径进行路径分发处理)*/
      /*
      http常用请求方式:
      1.get 查询
      2.post 添加
      3. put 更新
      4. delete 删除
      restful api(一种url格式)
      */
      const express=require('express');
      const app=express();
      /*四种基本的路由请求方式*/
      /*app.get('/',(req,res)=>{
      res.send('get data');
      });
      app.post('/',(req,res)=>{
      res.send('post data');
      });
      app.put('/',(req,res)=>{
      res.send('put data');
      });
      app.delete('/',(req,res)=>{
      res.send('delete data');
      });*/
      // 直接使用use可以处理所有的路由请求分发
      app.use('/',(req,res)=>{
       res.send('hello');
      });
      app.listen(3000,()=>{
      console.log('running....');
      });
    • 中间件(就是处理过程中的一个环节(本质上相当于一个函数)):

    ​ // 中间件的挂载方式// use 路由(get post put delete);// next('route');跳转到下一路由


    const express=require('express');
    const app=express();
    let acessNum=0;
    //监听所有路径
    app.use('',(req,res,next)=>{
    /*记录访问时间*/
    console.log('哈哈,你怎么又来看我了');
    next()
    });
    app.use('/user',(req,res,next)=>{
    /*记录访问时间*/
    console.log(Date.now());
    next()
    });
    app.use('/user',(req,res,next)=>{
    /*记录访问日志*/
    console.log('welcome to this');
    next()
    });
    app.use('/user',(req,res)=>{
    /*记录访问次数*/
    acessNum++;
    console.log('访问量:'+acessNum);
    res.send('hello');

    });
    • 应用中间件:


      //登录验证
      /*中间件的应用,第3方中间件,body-parse的使用*/
      const express=require('express');
      const app=express();
      const bodyParser = require('body-parser');
      // 托管静态资源
      app.use(express.static('public'));
      // 处理get请求方式参数

      //挂载body-parser中间件
      app.use(bodyParser.urlencoded({ extended: false }));
      //当data为json格式的时候需要加载下面代码
      //app.use(bodyParser.json())
      app.get('/login',(req,res)=>{
      // 通过req.query属性获得get方式参数
           let data=req.query;
             if(data.username=='admin'&&data.password=='123'){
            res.send('success');
            }else{
            res.send('failure');
            }
         
      });
      //处理post请求、
      app.post('/login',(req,res)=>{
      let data=req.body;
      console.log(data);
       if(data.username=='admin'&&data.password=='123'){
            res.send('success');
            }else{
            res.send('failure');
            }
       
      });
      app.listen(3000,()=>{
      console.log('running....');
      });
    • express中使用art-template模板:

      1.安装包:


      npm install --save art-template
      npm install --save express-art-template

      2.使用:


      // 设置模板的路径
      app.set('views',path.join(__dirname,'views'));
      // 设置模板引擎
      app.set('view engine','art');
      // 使express兼容art-template模板引擎
      app.engine('art', require('express-art-template'));
      // 参数一:模板名称;参数二:渲染模板的数据
         res.render('list',data);

  • 相关阅读:
    js 数组去重求和 (转载)
    表格插件汇总(转载)
    SQL Server 用一张表的数据更新另一张表的数据(转载)
    C#创建DataTable(转载)
    C# DataTable 和List之间相互转换的方法(转载)
    维度表,实体表,事实表之间的关系
    Scala中foldLeft的总结
    Scala集合Map
    从合并两个Map说开去
    UDAF(用户自定义聚合函数)求众数
  • 原文地址:https://www.cnblogs.com/buautifulgirl/p/9834498.html
Copyright © 2011-2022 走看看