Nodejs流、爬虫、模块化、脚本

流–使用node制作压缩包

  • 水流

  • 分析

    • 两个杯子,一个出,一个入
    • 水 持续倒入的
  • 总结:

    • 杯子
      • 入: 可写的流
      • 出: 可读的流
      • data Node.js中数据是分片【 chunk 】传输的
  • 为了提高性能,减少能耗【 cpu 】

    • 管道流 【 连接 I/O 之间的一个管道】,这个管道我们称之为: pipe
  • gulp就是一来了Node.js流的概念,它才能在grunt竞争中胜出

Node.js中数据传输是分片的流

// const in = fs.createReadStream(文件路径)
// 通过fs文件系统将1.txt中的内容读出来 - 班长水杯中的水倒出来
// 通过fs文件系统将 data 中的内容写进去
//const out = fs.createWriteStream('1.txt.gz') 创建可写的流 
const zlib = require('zlib') //压缩包模块
const fs = require('fs') //文件系统
const inp = fs.createReadStream('./dist/1.txt')
const out = fs.createWriteStream('./dist/1.txt.gz')
const gzlib = zlib.createGzlip() //创建一个空压缩包
inp.pipe(gzlib).pipe(out) //管道流操作创建压缩文件
  1. http
  • 搭建路由:nodejs官网http模块下搜索http.get
  • 把例子粘贴下来
    • 状态码含义:
    • 200(“OK”)一切正常。实体主体中的文档(若存在的话)是某资源的表示。
    • 500(“Bad Request”)
      客户端方面的问题。实体主题中的文档(若存在的话)是一个错误消息。希望客户端能够理解此错误消息,并改正问题。
    • 500(“Internal Server Error”)
      服务期方面的问题。实体主体中的文档(如果存在的话)是一个错误消息。该错误消息通常无济于事,因为客户端无法修复服务器方面的问题。
    • 301(“Moved Permanently”)
      当客户端触发的动作引起了资源URI的变化时发送此响应代码。另外,当客户端向一个资源的旧URI发送请求时,也发送此响应代码。
    • 404(“Not Found”) 和410(“Gone”)
      当客户端所请求的URI不对应于任何资源时,发送此响应代码。404用于服务器端不知道客户端要请求哪个资源的情况;410用于服务器端知道客户端所请求的资源曾经存在,但现在已经不存在了的情况。
    • 409(“Conflict”)
      当客户端试图执行一个”会导致一个或多个资源处于不一致状态“的操作时,发送此响应代码。
   http.get('http://nodejs.org/dist/index.json', (res) => {
  const { statusCode } = res;  // 获取状态码  1xx - 5xx
  const contentType = res.headers['content-type']; // 文件类型  text/json/html/xml

  let error;
  // 错误报出,状态码不是200,报错,不是json类型报错
  if (statusCode !== 200) {
    error = new Error('Request Failed.\n' +
                      `Status Code: ${statusCode}`);
  } else if (!/^application\/json/.test(contentType)) {
    error = new Error('Invalid content-type.\n' +
                      `Expected application/json but received ${contentType}`);
  }
  if (error) {
    console.error(error.message);
    // consume response data to free up memory
    res.resume();  // 继续请求
    return;
  }

  res.setEncoding('utf8'); // 字符编码 

  // 核心 -- start
  let rawData = '';
  res.on('data', (chunk) => { rawData += chunk; }); // 数据拼接 
  res.on('end', () => { // 数据获取结束
    try {
      const parsedData = JSON.parse(rawData);
      console.log(parsedData);
    } catch (e) {
      console.error(e.message);
    }
  });

  // 核心  -- end
}).on('error', (e) => {
  console.error(`Got error: ${e.message}`);
});

  • 爬虫
  • 通过后端语言爬取网站中的数据,然后通过特定模块进行数据清洗,最后将数据输出给前端
  • 不是所有网站都能爬取的
  • 案例:
    • http.get
    • 数据清洗: 第三方插件【 模块 】 cheerio【 不要写es6 】
1. 先打开要爬取的网页,查看network,先看Doc数据
   - 如https://www.lagou.com/
 
2. 创建options,设置get的第一个参数
const options = {
 hostname: 'www.google.com',
  port: 80,
  path: '/upload',
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': Buffer.byteLength(postData)
  }
};
3. 把判断json格式的那段代码拿掉(因为是text格式的文件)headers与herder那里容易出错
4. 使用cheerio进行数据清洗,需要先npm安装再引入。能够清洗html结构的字符串。
5. 在try里面清洗数据
6. 使用nodejs实现静态服务器(必会)
/* 
  后端中服务器类型有两种
    1. web服务器【 静态服务器 】  
      - 举例: wamp里面www目录
      - 目的是为了展示页面内容
      - 前端: nginx 
    2. 应用级服务器[ api服务器 ]
      - 后端接口
      - tomcat

  做什么?
    -   使用Node.js原生代码实现静态服务器  【 必会 】
*/
  const http = require( 'http' )

  const port = 3000 

  const hostname = 'localhost' // 127.0.0.1

  http.createServer((request,response) => {

    response.writeHead( 200, {
      'Content-Type': 'text/html;charset=utf8'
    })

    response.write('hello Node.js - 千锋教育')

    response.end()

  }).listen(port,hostname,() => {
    // 参数: 端口   域名    监听回调
    console.log(`The Server is running at: http://${ hostname }:${ port }`)
  })
  1. Node.js中的模块化 【 必会的 】
    • 模块化
      • 为什么前端要使用模块化?
      • 分析: html中引入多个js文件,使用script标签对
      • Node.js都是js文件,思考: js文件如何引入其他类型文件
      • 答案: 模块化
      • 好处:
        • 复用性高,一次定义,多次使用
    • 前端模块化
      • AMD
        • AMD的实现需要使用 require.js
      • CMD
        • CMD的实现需要使用 sea.js 【 不更新 】
      • Common.js
        • Node.js使用了Common.js规范
          • 内置模块引用
          • 自定义模块引用
          • 第三方模块引用
/* 
  request第三方模块
    作用: 数据请求
    使用: 
       1. 安装
          npm/cnpm i/install request --dev-save/-D           开发环境安装
          npm/cnpm i/install request --save/-S               生产环境安装
       2. 导入
          let/var/const 变量名  =  require( 模块名称 )
       3. 使用

    思考: 我在Node.js文件中进行数据请求,存在跨域吗?

    分析: 
          跨域 -》 同源策略 -》 浏览器

    结果: 不存在 
*/

const request = require( 'request' )

request('https://m.lagou.com/listmore.json',( error,response,body ) => {
  // 参数说明: error  错误信息    response  响应结果   body 获取的数据

  console.log( body )

})
  • EcmaScript 模块化

  • es5

    • module.export / exports
  • es6

    • export default / export
  • 总结:

    1. AMD 和 CMD 都是通过关键字 define 来定义模块的,通过require来引入模块
    1. es6模块化 【 前端里程碑 】
    • export default 默认导出一个 , import xx from xxx
    • export 批量导出,导出多个, import { xxx } from xxx
  • 面试题

  • Common.js属于Node.js Y/N ? N

  1. npm 【 了解 】

    • npm包上传npmjs.com这个网站
    • 第三方模块都是别人上传的,那么我们想:我们是否也可以上传?
    • 当然可以
    • 步骤
        1. 创建一个自定义模块 【 文件夹名称一定记住是唯一的,去npmjs.com查是否有 】
        1. 创建package.json文件
        1. 将npm源切换到npmjs上 【 nrm切换 】
        • nrm安装: cnpm i nrm -g
        • nrm ls 列出当前所有源
        • nrm use 源名称 切换到某一个源
        1. 注册npmjs.com账号 【 qq邮箱 】
        1. 激活npmjs.com账号 【 重要/ 犯错高发点 】【 小弹框只出一次 】
        1. 在当前目录下登录npm账号
        • $ npm adduser
        1. 填写用户名、密码、激活邮箱
        1. 发布
        • $ npm publish
    • 自定义模块
      打造一个name的模块
      打造步骤:
      1. 创建模块 Function / Object / String
      2. 导出模块
        • module.exports = 模块名称 导出一个
        • module.exports = {} // 导出多个
      3. 导入模块
        • var/let/const 变量名 = require( 相对【 网络 】路径 )

        • var/let/const { 变量名 } = require( 相对路径 ) // 引入多个

  2. 前端环境

    • 开发环境
    • 生产环境
      • 二阶段项目
    • 测试环境
      • 测试代码运行情况
        • 测试代码质量
        • 测试代码风格
    • 预上线环境
      • beta版本 【 内测 】
    • 上线环境
      • 放在云服务器/服务器主机中的项目,可以供任何用户使用
  3. npm脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值