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

二、Buffer缓存区和文件模块

1、Buffer缓存区

概念

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

创建缓存区

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

写入缓存区

  1. buf.write('字符串')

读缓存区

  1. buf.toString()

复制缓存区

  1. buf.copy(buf2)

2、文件模块(fs)

读取文件

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

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

写文件

同步版本:

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

异步版本:

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

读取文件信息

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

删除文件

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

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

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

流式读取

  • 流:什么是流

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

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

    1. var fs = require("fs");
    2. // 创建一个可读流
    3. var readerStream = fs.createReadStream('input.txt');
    4. // 创建一个可写流
    5. var writerStream = fs.createWriteStream('output.txt');
    6. // 管道读写操作
    7. // 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
    8. readerStream.pipe(writerStream);
    9. console.log("程序执行完毕");
    • 链式流
    1. //压缩文件
    2. var fs = require('fs');
    3. var zlib = require('zlib');
    4. // 压缩 input.txt 文件为 input.txt.gz
    5. fs.createReadStream('input.txt')
    6. .pipe(zlib.createGzip())
    7. .pipe(fs.createWriteStream('input.txt.gz'))
    8. console.log("文件压缩完成。");
    9. //解压文件
    10. var fs = require("fs");
    11. var zlib = require('zlib');
    12. // 解压 input.txt.gz 文件为 input.txt
    13. fs.createReadStream('input.txt.gz')
    14. .pipe(zlib.createGunzip())
    15. .pipe(fs.createWriteStream('input.txt'));
    16. console.log("文件解压完成。");

三、常用模块与网络爬虫

1、常用模块

path模块

  • 格式化路径
  1. path.nomalize(p)
  • 拼接路径(将多个字符串拼接成一个完整路径)
  1. /*使用path.jon拼接文件路径和 连接符 拼接优点
  2. 1.自动帮我们添加路径分隔符(根据当前操作系统)
  3. 2.自动改正错误的路径分隔符
  4. */
  5. path.join(path1,path2)
  6. let url = path.join(__dirname,path1); //常用
  • 返回路径中文件夹部分
  1. path.dirname(p)
  • 返回路径中文件部分(文件名和扩展名)
  1. path.basename(p)
  • 返回路径中文件的后缀名
  1. path.extname(p)
  • 返回路径字符串的对象。
  1. path.parse(path)
  • 从对象中返回路径字符串,和parse相反
  1. 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方法(用于模仿客户端从服务器获取数据)
    1. var http = require('http');
    2. http.get('url',function(res){
    3. //res 是返回对象,接收到服务器响应的所有内容
    4. res.on("data",function(a){
    5. a //以流的方式获取数据 //每节64kb
    6. })
    7. })

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. poi导出word表格跨行

    DataCommon.java package com.ksource.pwlp.model.statistic; public class DataCommon { private Long id; ...

  2. Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 解决办法(转)

    使用yum update 更新的时候出现 “Couldn’t open file /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7” 这样的提示,去CentOS的官网:htt ...

  3. Linux权限:提示-bash: ./startup.sh: Permission denied的解决方案

    Linux权限:提示-bash: ./startup.sh: Permission denied的解决方案 Linux上启动Tomcat,结果弹出:-bash: ./startup.sh: Permi ...

  4. <c:forEach>, <c:forTokens> 标签

    这些标签封装了Java中的for,while,do-while循环. 相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象. <c:forTokens&g ...

  5. 将旧版本jQuery升级到新版本的jQuery

    需要将项目中的旧版本jQuery升级到新版本的jQuery,为解决兼容性问题得下载一个js兼容包.例子:升级的项目中jQuery1.x到jquery3.x,需要一个jquery-migrate-3.1 ...

  6. 查找算法(6)--Block search--分块查找

    1. 分块查找 (1)说明分块查找又称索引顺序查找,它是顺序查找的一种改进方法. (2)算法思想:将n个数据元素"按块有序"划分为m块(m ≤ n).每一块中的结点不必有序,但块与 ...

  7. Centos7安装完成后设定基本的网络配置

    Centos7设定网络 新安装的centos7,网络默认是不启动的,需要人为的手工修改配置文件,在这里把这个过程简要的记录一下. 设定ip地址与mac地址自定义 [root@web ~]# cd /e ...

  8. node读写本地文件

    http://nodejs.cn/api/fs.html#fs_fs_writefilesync_file_data_options https://www.cnblogs.com/diaosizha ...

  9. Appium 中使用 pressKeyCode 方法不起作用也没有报错

    为了使 appium 支持 Android 系统 7 及以上,automationName 使用了 UIAutomator2.但是发现,使用androidDriver.pressKeyCode(And ...

  10. .NET平台历程介绍

    .Net平台的背景 1. 2010之前 的PC时代的时候,互联网规模还不是特别庞大,以静态编译式语言为代表的JAVA和.Net没什么太大区别,.net以windows自居. 2. 2010年以JAVA ...