一、Node.js基础知识

1、概念

  • 简单的说 Node.js 就是运行在服务端的 JavaScript。
  • Node.js 是JavaScript的运行环境
  • Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。

2、安装使用

官网下载地址:http://nodejs.cn/

nodeJS5个基本对象:

  • 1、require 引入模块
  • 2、export 导出对象
    • 语法:

      • export.属性 = 值;
      • export.方法名 = 函数;
    • 注意:
      • export时module对象的引用 export == module.export (指向同一个内存空间)
      • export是module.export的引用, 不能改指向,只能添加属性和方法
      • module.export才是真正的暴露对象,指向哪里就暴露哪里-----推荐使用
  • 3、module 模块对象
    • module.export

      • module.export.属性 = 值
      • module.export.方法名 = 函数
      • module.export = 对象或函数
    • module.id 模块id,模块名称
    • module.parent 模块父级
    • module.filename 模块文件名和路径
    • module.children 子模块列表
    • module.paths 模块查找路径,如果当前目录找不到
    • node_modules就去上一级目录找,直到根目录
  • 4、__filename 当前js文件的绝对路径
  • 5、__dirname 当前js文件所在文件夹绝对路径

npm包管理器(node Package Manager)

  • package.json是node.js的项目描述文件,以json格式的形式描述项目
  • 创建package.json文件 ----> npm init ------ npm init -y ---->自动全部yes创建
  • package.json常用属性
    • name: 项目名称
    • version:版本号
    • description:项目描述
    • main:主模块
    • dependencies:项目依赖
    • devDependencies :开发时依赖
    • scripts:脚本命令,可以使用npm命令执行
    • license:开源协议
  • npm常用指令:
    • npm install <包的名称> i--->install
    • npm i <包的名称>@版本号 //安装指定版本
    • npm i <包的名称> -g全局安装 -S(save)写入项目依赖列表 -D(dev)写入开发依赖列表
    • npm search <包的名称> //搜索包
    • npm view <包的名称> //查看包
    • npm uninstall <包的名称> //卸载包
    • npm update <包的名称> //更新包

cnpm (淘宝镜像)

  • npm install -g cnpm --registry=https://registry.npm.taobao.org

nodeJS回调函数

  • 回调函数机制:

    • a.定义一个普通函数
    • b.将函数作为参数传入另一个函数(调用者)
    • c.调用者在执行过程中根据时机和条件决定是否调用函数
  • 回调函数用途:
    • 通常用于在达到某个时机或条件时,需要执行代码的情况,使用回调函数

同步和异步

  • 同步:上一行执行完成后,下一行才能得到执行

  • 异步:将比较复杂的任务以任务线程实现,不用等上一句执行完成,下一句也能执行。

  • 异步的三种实现方式:

    • (1) 回调函数

      回调函数不一定是异步(forEacch),异步一定有回调函数
    • (2) 事件 (针对服务器端的事件)

      事件源.on('事件名称',回调函数)
    /* 开启一个服务器*/
    var http = require('http');
    // 建立服务器
    var app = http.createServer(function(request, response) {
    response.writeHead(200, {
    "Content-Type": "text/plain"
    });
    response.end("Hello world!");
    });
    //启动服务器
    app.listen(80,function(){
    console.log('服务器已运行')
    })
    • (3) promise 承诺对象
    /*
    什么是promise?
    promise是es6中新增的承诺对象,用于对异步的操作进行消息的传递
    promise的状态?
    Pending 等待中
    Resolved 成功
    Rejected 失败
    Pending => Resolved
    Pending => Rejected
    promise 有什么用?
    promise可以传递异步消息
    由于异步的返回结果时间顺序不可控,所以需要使用promise来统一控制输出结果
    */
    var promise = new Promise(function(resove,reject){
    resolve()
    })
    //调用对象
    promise.then(res>{
    //成功的回调
    }).catch(err=>{
    //失败的回调
    }) //利用promise对象的all方法可以实现手动调整输出顺序,相当于把异步变为同步
    Promise.all([p1,p2]).then(datas=>{
    //返回数组
    })

二、Buffer缓存区和文件模块

1、Buffer缓存区

概念

在内存中开辟了一个临时区域,用于存放我们需要运算的字节码

创建缓存区

  • 创建指定长度的缓存区
var buf = new Buffer(大小) //创建5个字节的缓存区
buf.write('a') //存入一个字节 转成16进制 的Ascall码的61 在node中默认使用utf-8编码,一个中文3个字节
  • 按指定的数组编码创建缓存区
var buf = new Buffer([十进制编码]) //数字小可以
  • 按指定字符创建缓存区
var buf = new Buffer('字符串')

写入缓存区

buf.write('字符串')

读缓存区

buf.toString()

复制缓存区

buf.copy(buf2)

2、文件模块(fs)

读取文件

  • 由于nodejs是服务端程序,必须要有文件读写操作,在客户端没有这样的功能
  • 文件读写有两种方式:
    • 直接读取:

      • 将硬盘上的所有内容全部读入内存以后才触发回调函数
      • 两种写法:
      //异步:定义一个回调函数,接收读取到的内容
      fs.readFile('文件路径',(err,data)=>{}) //同步:几乎所有fs的函数都有同步版本,只需在异步版本后面加Sync即可 (Async:异步)
      fs.readFileSync('文件路径')
    • 流式读取:
      • 将数据从硬盘中读取一节就触发回调函数,实现大文件操作

写文件

同步版本:

fs.writeFileSync('文件名','数据')

异步版本:

fs.writeFile('文件名','数据',funciton(err){/*写完文件以后执行的代码*/})

读取文件信息

fs.stat('文件名',function(err,state){
//state时文件信息对象,包含了常用的文件信息
//size: 文件大小,单位字节
//mtime: 文件修改时间
//birthtime 文件创建时间 //方法
.isFile() //判断当前查看的对象是不是一个文件
.isDirectory() //判断是不是一个目录
})

删除文件

fs.unlink('文件名',function(err){})

需求:填写代码实现删除一个非空目录

  • 删除空目录
fs.rmdir()
  • 读取目录中的文件及文件夹列表
fs.readdir()
  • 读取每一个文件夹的详细信息
fs.stat()
  • 判断如果是文件
fs.unlink()
  • 判断如果是目录
//递归调用自己
  • 删除空目录
fs.rmdir()
  • 演示代码
var fs = require('fs');
var path = require('path');
function rmdir(p){
//获取文件列表
var list = fs.readdirSync(p);
list.forEach((item)=>{
//拼接路径
let p1 = path.join(p,item);
//判断是否为文件
if(fs.statSync(p1).isFile()){
fs.unlinkSync(p1);
}else{
//递归调用自己
arguments.callee(p1);
}
})
//删除空文件夹
fs.rmdirSync(p);
}
rmdir('./data1');

流式读取

  • 流:什么是流

    • 所有互联网的数据都是以流的方式,流式一组有起点有终点的数据传输方式
  • 流的操作:
    • 流式读取文件
    //可读取数据的流
    var fs = require("fs");
    var data = ''; // 创建可读流
    var readerStream = fs.createReadStream('input.txt'); // 设置编码为 utf8。
    readerStream.setEncoding('UTF8'); // 处理流事件 --> data, end, and error
    readerStream.on('data', function(chunk) {
    data += chunk;
    }); readerStream.on('end',function(){
    console.log(data);
    }); readerStream.on('error', function(err){
    console.log(err.stack);
    });
    console.log("程序执行完毕");
    • 以流的方式写文件
    //可写入数据的流
    var fs = require("fs");
    var data = 'hello world'; // 创建一个可以写入的流,写入到文件 output.txt 中
    var writerStream = fs.createWriteStream('output.txt'); // 使用 utf8 编码写入数据
    writerStream.write(data,'UTF8'); // 标记文件末尾
    writerStream.end(); // 处理流事件 --> data, end, and error
    writerStream.on('finish', function() {
    console.log("写入完成。");
    }); writerStream.on('error', function(err){
    console.log(err.stack);
    }); console.log("程序执行完毕");
    • 管道流

      管道提供了一个输出流到输入流的机制。通常我们用于从一个流中获取数据并将数据传递到另外一个流中

    var fs = require("fs");
    
    // 创建一个可读流
    var readerStream = fs.createReadStream('input.txt'); // 创建一个可写流
    var writerStream = fs.createWriteStream('output.txt'); // 管道读写操作
    // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
    readerStream.pipe(writerStream); console.log("程序执行完毕");
    • 链式流
    //压缩文件
    var fs = require('fs');
    var zlib = require('zlib');
    // 压缩 input.txt 文件为 input.txt.gz
    fs.createReadStream('input.txt')
    .pipe(zlib.createGzip())
    .pipe(fs.createWriteStream('input.txt.gz'))
    console.log("文件压缩完成。"); //解压文件
    var fs = require("fs");
    var zlib = require('zlib'); // 解压 input.txt.gz 文件为 input.txt
    fs.createReadStream('input.txt.gz')
    .pipe(zlib.createGunzip())
    .pipe(fs.createWriteStream('input.txt')); console.log("文件解压完成。");

三、常用模块与网络爬虫

1、常用模块

path模块

  • 格式化路径
path.nomalize(p)
  • 拼接路径(将多个字符串拼接成一个完整路径)
/*使用path.jon拼接文件路径和 连接符 拼接优点
1.自动帮我们添加路径分隔符(根据当前操作系统)
2.自动改正错误的路径分隔符
*/
path.join(path1,path2)
let url = path.join(__dirname,path1); //常用
  • 返回路径中文件夹部分
path.dirname(p)
  • 返回路径中文件部分(文件名和扩展名)
path.basename(p)
  • 返回路径中文件的后缀名
path.extname(p)
  • 返回路径字符串的对象。
path.parse(path)
  • 从对象中返回路径字符串,和parse相反
path.format(path)

url模块

  • 什么是url?

    • url是全球统一资源定位符,对网站资源的一种简洁表达式,简称网址
  • url的构成
    • 完整

      协议://用户名:密码@主机名.名.域:端口号/目录名/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash
    • 常见

      协议://主机名.名.域/目录名/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash
  • node.js的url模块
    • 在node.js中提供了两套给予url进行处理的API功能
    • url模块 和 (WHATWG URL标准模块)

http模块

  • http协议
  • 软件开发模式
    • 单机模式
    • C/S模式 (Client / Server)
    • B/S模式 (Brower / Server)
  • http模块
    • get方法(用于模仿客户端从服务器获取数据)
        var http = require('http');
    http.get('url',function(res){
    //res 是返回对象,接收到服务器响应的所有内容
    res.on("data",function(a){
    a //以流的方式获取数据 //每节64kb
    })
    })

2、网络爬虫

概念

是一种自动获取网页内容的程序

实现思路

  • 打开网页内容,查看源代码,分析需要获取的内容规律

  • 编写代码,打开网页,获取html源代码

  • 通过正则表达式提出所需要的内容

  • 遍历数据,批量获取所需要的内容

  • 示例代码请点击这里

nodeJS从入门到进阶一(基础部分)的更多相关文章

  1. nodeJS从入门到进阶三(MongoDB数据库)

    一.MongoDB数据库 1.概念 数据库(DataBase)是一个按照数据结构进行数据的组织,管理,存放数据的仓库. 2.关系型数据库 按照关系模型存储的数据库,数据与数据之间的关系非常密切,可以实 ...

  2. nodeJS从入门到进阶二(网络部分)

    一.网络服务器 1.http状态码 1xx: 表示普通请求,没有特殊含义 2xx:请求成功 200:请求成功 3xx:表示重定向 301 永久重定向 302 临时重定向 303 使用缓存(服务器没有更 ...

  3. SQL Server AlwaysON从入门到进阶(3)——基础架构

    本文属于SQL Server AlwaysON从入门到进阶系列文章 前言: 本文将更加深入地讲解WSFC所需的核心组件.由于AlwaysOn和FCI都需要基于WSFC之上,因此我们首先要了解在Wind ...

  4. SQL Server 扩展事件(Extented Events)从入门到进阶(2)——在GUI中创建基础扩展事件

    本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 第一篇文章中提到了如何在Profiler中创建跟踪(trace),并以服务器端(server-side)跟 ...

  5. Weex入门与进阶指南

    Weex入门与进阶指南 标签: WeexiOSNative 2016-07-08 18:22 59586人阅读 评论(8) 收藏 举报 本文章已收录于:  iOS知识库  分类: iOS(87)  职 ...

  6. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events

    由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...

  7. SQL Server AlwaysON从入门到进阶(1)——何为AlwaysON?

    本文属于SQL Server AlwaysON从入门到进阶系列文章 本文原文出自Stairway to AlwaysOn系列文章.根据工作需要在学习过程中顺带翻译以供参考.系列文章包含: SQL Se ...

  8. SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念

    本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列 在第一二节中,我们创建了一些简单的.类似典型SQL Trace的扩展事件会话.在此过程中,介绍了很多扩展事 ...

  9. Python语言学习之Python入门到进阶

    人们常说Python语言简单,编写简单程序时好像也确实如此.但实际上Python绝不简单,它也是一种很复杂的语言,其功能特征非常丰富,能支持多种编程风格,在几乎所有方面都能深度定制.要想用好Pytho ...

随机推荐

  1. 避免git clone和push时每次都需要输入用户名和密码

    有三种方式解决git clone时每次都需要输入用户名和密码, 1. SSH免密方式 使用git bash ssh-keygen或puttygen.exe生成公钥. 2. 配置全局开机存储认证信息 下 ...

  2. mysql8.0:SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

    忽然注意到的情况: 2018/7/19至2018/9/13之间发布的7.1.20.7.1.21.7.1.22和7.2.8.7.2.9.7.2.10这六个版本提供的对caching_sha2_passw ...

  3. XML 中 5 个预定义的实体引用

    < < 小于 > > 大于 & & 和号 &apos; ' 省略号 " " 引号

  4. Python用积分思想计算圆周率

    [文本出自天外归云的博客园] 早上起来突然想求圆周率,1单位时圆的面积. 代码如下: from math import pow, sqrt def calc_circle_s_with(r, dy, ...

  5. IDEA光标类的操作

    1.Ctrl+Alt+Left/Right   光标定位到上一个/下一个浏览位置处: 2.Ctrl+Shift+Backspace   光标定位到上次修改的地方: 3.Alt+Up/Down   移动 ...

  6. 泡泡一分钟:Collaborative Mapping with Pose Uncertainties using different Radio Frequencies and Communication Modules

    张宁 Collaborative Mapping with Pose Uncertainties using different Radio Frequencies and Communication ...

  7. LeetCode 104. Maximum Depth of Binary Tree(二叉树深度)

    Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...

  8. Multitenancy

    Multitenancy https://www.gartner.com/en/information-technology/glossary/multitenancy 公用一套物理环境,划分出不同的 ...

  9. 快速安装Python3+RobotFrameowork自动化测试环境

    1. 安装Python3(笔者这里安装的Python3.6.5) 安装 robotframework :   pip install robotframework -U pip install rob ...

  10. Django Model 模型

    参考: https://www.runoob.com/django/django-model.html https://www.cnblogs.com/taosiyu/p/11260000.html ...