Egret入门学习日记 --- 第六十四篇(书中 19.4 节 内容)

第六十四篇(书中 19.4 节 内容)

  昨天的问题,是 images 库自己本身的问题。

  我单独使用都报错。

  这是main.js文件代码:

let images = require("images");

console.log(images);

  这是cmd运行命令历史:

Microsoft Windows [版本 10.0.16299.15]
(c) 2017 Microsoft Corporation。保留所有权利。

C:\Users\Administrator\Desktop\a>node mian.js
module.js:550
    throw err;
    ^

Error: Cannot find module ‘C:\Users\Administrator\Desktop\a\mian.js‘
    at Function.Module._resolveFilename (module.js:548:15)
    at Function.Module._load (module.js:475:25)
    at Function.Module.runMain (module.js:694:10)
    at startup (bootstrap_node.js:204:16)
    at bootstrap_node.js:625:3

C:\Users\Administrator\Desktop\a>node main.js
C:\Users\Administrator\Desktop\a\node_modules\images\scripts\util\binding.js:20
      throw new Error(errors.missingBinary());
      ^

Error: Missing binding C:\Users\Administrator\Desktop\a\node_modules\images\vendor\win32-x64-57\binding.node
images could not find a binding for your current environment: Windows 64-bit with Node.js 8.x

Found bindings for the following environments:
  - Windows 64-bit with Node.js 8.x

This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild images --force` to build the binding for your current environment.
    at module.exports (C:\Users\Administrator\Desktop\a\node_modules\images\scripts\util\binding.js:20:13)
    at Object.<anonymous> (C:\Users\Administrator\Desktop\a\node_modules\images\index.js:32:51)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\Users\Administrator\Desktop\a\main.js:1:76)

C:\Users\Administrator\Desktop\a>npm i
npm WARN new@1.0.0 No description
npm WARN new@1.0.0 No repository field.

audited 285 packages in 2.095s
found 0 vulnerabilities

C:\Users\Administrator\Desktop\a>node main.js
C:\Users\Administrator\Desktop\a\node_modules\images\scripts\util\binding.js:20
      throw new Error(errors.missingBinary());
      ^

Error: Missing binding C:\Users\Administrator\Desktop\a\node_modules\images\vendor\win32-x64-57\binding.node
images could not find a binding for your current environment: Windows 64-bit with Node.js 8.x

Found bindings for the following environments:
  - Windows 64-bit with Node.js 8.x

This usually happens because your environment has changed since running `npm install`.
Run `npm rebuild images --force` to build the binding for your current environment.
    at module.exports (C:\Users\Administrator\Desktop\a\node_modules\images\scripts\util\binding.js:20:13)
    at Object.<anonymous> (C:\Users\Administrator\Desktop\a\node_modules\images\index.js:32:51)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (C:\Users\Administrator\Desktop\a\main.js:1:76)

C:\Users\Administrator\Desktop\a>npm rebuild images --force
npm WARN using --force I sure hope you know what you are doing.

> [email protected]3.0.2 install C:\Users\Administrator\Desktop\a\node_modules\images
> node ./scripts/install.js

Downloading binary from https://github.com/zhangyuanwei/node-images/releases/download/v3.0.2/win32-x64-57_binding.node
Cannot download "https://github.com/zhangyuanwei/node-images/releases/download/v3.0.2/win32-x64-57_binding.node":

ESOCKETTIMEDOUT

Hint: If github.com is not accessible in your location
      try setting a proxy via HTTP_PROXY, e.g.

      export HTTP_PROXY=http://example.com:1234

or configure npm proxy via

      npm config set proxy http://example.com:8080
[email protected]3.0.2 C:\Users\Administrator\Desktop\a\node_modules\images

C:\Users\Administrator\Desktop\a>node main.js
module.js:682
  return process.dlopen(module, path._makeLong(filename));
                 ^

Error: \\?\C:\Users\Administrator\Desktop\a\node_modules\images\vendor\win32-x64-57\binding.node is not a valid Win32 application.
\\?\C:\Users\Administrator\Desktop\a\node_modules\images\vendor\win32-x64-57\binding.node
    at Object.Module._extensions..node (module.js:682:18)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)
    at Module.require (module.js:597:17)
    at require (internal/module.js:11:18)
    at module.exports (C:\Users\Administrator\Desktop\a\node_modules\images\scripts\util\binding.js:24:10)
    at Object.<anonymous> (C:\Users\Administrator\Desktop\a\node_modules\images\index.js:32:51)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)

C:\Users\Administrator\Desktop\a>

  那我就不理会这个库了,反正只是做一些图片的裁剪而已。

  

  开始 19.4节。

  

  

  重点:

    1、通过谷歌提供Har功能,保存 har 文件。

    2、解析HAR文件。

    3、编写代码,下载对应文件。

  操作:

    1、通过谷歌提供Har功能,保存 har 文件。

      

      

    2、解析HAR文件。

      

    3、编写代码,下载对应文件。

      上代码(我写了很详细的注释了):

        let jsonStr = fs.readFileSync(‘./developer.egret.com.har‘, ‘utf-8‘);
            let obj = JSON.parse(jsonStr);
            let array: Array<any> = obj.log[‘entries‘];
            let totalNum = 0;

            //资源列表
            let resList = [];
            for (let i = array.length - 1; i >= 0; i--) {

                //由于 node.js 的 http 模块 不支持 https 协议,所以要把 https 协议 过滤掉。
                if ((<string>array[i].request.url).indexOf("https:") != -1) {
                    continue;
                }

                let resItem = {
                    url: array[i].request.url,
                    time: 0
                };
                resList.push(resItem);
            }

            initLodar(resList);

            /** 解析资源,并下载 */
            function initLodar(resList: Array<any>) {
                //下载后要保存到的文件夹名
                let downSaveDirName = "download";
                if (fs.existsSync(downSaveDirName) == false) {
                    fs.mkdirSync(downSaveDirName);
                }
                console.log("正在下载资源...文件总数为: " + resList.length);
                resList.forEach((item, index, array) => {
                    startDownLoadResItem(item, downSaveDirName);
                });

            }
            /** 使用nodejs 做http的请求
             * @param item 下载对象
             * @param downSaveDirName 下载后要保存到的文件夹名
            */
            function startDownLoadResItem(item, downSaveDirName) {
                let req = http.request(item.url, getReqCallback(item, downSaveDirName));
                req.on(‘error‘, (e) => {
                    if (item.time < 3) {
                        console.log("资源" + item.url + "错误,再次请求");
                        item.time++;
                        startDownLoadResItem(item, downSaveDirName);
                    } else {
                        console.log("该资源已经请求超过三次,但还是下载失败。");
                    }
                });

                req.end();
            }
            /** http请求的回调函数
             * @param item 下载对象
             * @param downSaveDirName 下载后要保存到的文件夹名
            */
            function getReqCallback(item, downSaveDirName) {
                /** 获取 http://www.hao.com/aa/bb.png 中的 bb.png */
                let fileName = path.basename(item.url);

                let tempName: string = item.url;

                /** 获取 http://www.hao.com/aa/bb.png 中的 aa/bb.png */
                let writeName = tempName.substring(tempName.indexOf(".")); //获取 http://www.hao.com/aa/bb.png 中的 .hao.com/aa/bb.png
                writeName = writeName.substring(writeName.indexOf("/") + 1); //获取 .hao.com/aa/bb.png 中的 aa/bb.png

                /** http请求后触发的回调
                 * @param res 请求后得到的数据
                 */
                function handler(res) {
                    /** 获取资源字节长度 */
                    let contentLength = parseInt(res.headers[‘content-length‘]);

                    /** 请求到的所有 buff 数据 */
                    let fileBuff = [];
                    res.on(‘data‘, function (chunk) {
                        let buffer = new Buffer(chunk);
                        fileBuff.push(buffer);
                    });

                    res.on(‘end‘, function () {
                        if (isNaN(contentLength)) {
                            console.log(item.url + "资源下载发生错误");
                            return;
                        }

                        /** 合并所有分段的 buff 数据 */
                        let totalBuff = Buffer.concat(fileBuff);

                        if (totalBuff.length < contentLength) {
                            console.log(item.url + "资源字节书不符,再次启动加载");
                            startDownLoadResItem(item, downSaveDirName);
                            return;
                        }

                        writeFile(downSaveDirName + "\\" + writeName, totalBuff, downSaveDirName, writeName, fileName);

                    });

                }
                let callback = handler;
                return callback;

            }
            /** 保存成文件
             * @param url 最终文件保存的目录
             * @param buffer 要保存的数据
             * @param dirName 保存文件的所在文件夹名
             * @param writeName 排除域名后的文件路径。如:获取 http://www.hao.com/aa/bb.png 中的 aa/bb.png
             * @param fileName 保存的文件名
            */
            function writeFile(url, buffer, dirName, writeName, fileName) {

                /** 保存的文件所在的文件夹名 */
                let tempDir = dirName;

                /** 获取 http://www.hao.com/aa/bb.png 中的 aa/bb.png */
                let tempPath = writeName;

                /** 获取 aa/bb.png 中的 aa */
                let targetPath = writeName.substring(0, writeName.lastIndexOf("/"));

                //检查文件是否存在,如果不存在则 递归创建文件夹
                // if (fs.existsSync(tempDir + targetPath) == false) { // 如果 downloadaa 不存在,这递归创建。。。为什么要判断 downloadaa ? 不是应该要判断 download 而已吗?我先注释吧
                if (fs.existsSync(tempDir + "\\" + targetPath) == false) { // 感觉书中应该是漏写了 \\ 吧,我就判断 download/aa 是否存在,如果不存在则开始创建递归创建文件夹
                    createFloader(tempDir, tempPath);
                }

                //开始保存文件
                fs.writeFile(url, buffer, (err) => {
                    if (err != null) {
                        console.log("写入文件错误" + dirName + "/" + writeName);
                    } else {
                        totalNum++;
                        console.log("当前数量" + totalNum + "写入文件成功:" + fileName);
                    }
                });
            }
            /** 递归创建文件夹
             * @param downSaveDirName 下载后要保存到的文件夹名
             * @param targetPath 剩下的文件路径。如:获取 http://www.hao.com/aa/bb.png 中的 aa/bb.png
            */
            function createFloader(downSaveDirName, targetPath: string) {
                if (targetPath.indexOf("/") == -1) return;

                /** aa/bb.png 中的 aa  */
                let temp = targetPath.substring(0, targetPath.indexOf("/"));
                targetPath = targetPath.substr(targetPath.indexOf("/") + 1); //获取 aa/bb.png 中的 bb.png
                downSaveDirName = downSaveDirName + "\\" + temp; // download\\aa  

                //文件夹不存在则创建一个
                if (fs.existsSync(downSaveDirName) == false) fs.mkdirSync(downSaveDirName);

                //如果还有子文件夹,则继续创建
                if (targetPath.indexOf("/") != -1) return createFloader(downSaveDirName, targetPath);

            }

      下载成功了:

      

  至此,19.4节 结束。

  吃饭。

原文地址:https://www.cnblogs.com/dmc-nero/p/11505924.html

时间: 09-11

Egret入门学习日记 --- 第六十四篇(书中 19.4 节 内容)的相关文章

第六十四篇、OC_计步器

计步器的实现方式主要有那么两种 1.通过直接调用系统的健康数据,基于HealthKit框架的,但是貌似是一小时更新一次数据.如果要实时获取步数,这种方式并不是最佳. 2.基于CoreMotion框架,顾名思义就是加速计/加速度传感器 >最早出现在iOS设备上的传感器之一 >加速计用于检测设备在X.Y.Z轴上的加速度 (哪个方向有力的作用) >加速计可以用于检测设备的摇晃,经典应用场景(例如摇一摇.计步器等) 源码: #import <Foundation/Foundation.h&

winform学习日志(二十四)----------datetime和timer的使用(小小幻灯片)

一:展示图片 每秒换一次图片,一共六十张图片,00-59 二:代码 a,设计代码 namespace timePicture { partial class Form1 { /// <summary> /// 必需的设计器变量. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清理所有正在使用的资源. /// </summary

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

汇编入门学习笔记 (六)—— si、di,双重循环

疯狂的暑假学习之  汇编入门学习笔记 (六)-- si.di,双重循环 参考: <汇编语言> 王爽 第7章 1. and和or指令,与[bx+idata] and和or,就不多说了. [bx+idata] 这样写是可以的,某些情况下,比较方便. [bx+idata] 也可以写成 idata[bx] 直接见例子: 把'ABcde' 跟 'fGHig' 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data d

Android学习路线(二十四)ActionBar Fragment运用最佳实践

通过前面的几篇博客,大家看到了Google是如何解释action bar和fragment以及推荐的用法.俗话说没有demo的博客不是好博客,下面我会介绍一下action bar和fragment在实战中的应用,以及相关demo源码,希望和大家相互交流. 了解过fragment的同学们应该都知道,fragment是android 3.0版本才出现的的,因此如果要在支持android 3.0一下版本的工程中使用fragment的话是需要添加Support Library的.具体如何添加我就不再赘述

第十四篇 现象

第十四篇  现象 "现象"的产生是由宇宙当中各种因素交汇的结果.现象是万物在宇宙中的展现,它可以被人为创造,也可以由宇宙规律自行产生.现象能帮助人类逐步地了解宇宙的本质,也能帮助人类更好地了解自己. 当一个生命对宇宙有足够高度的认识之后就会留意所有的现象,并从这些现象当中去探索自身以及宇宙的奥秘.可以说,生命的成长过程就是不断地分析与探索各种现象,从而总结经验,让自身不断提高探索宇宙奥秘能力的一个历练过程. 随着对各种现象的不断分析与探索,人类会越来越深刻地认识到现象背后的本质,而不会

NHibernate 存储过程 第十四篇

NHibernate 存储过程 第十四篇 NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DELETE FROM Person WHERE PersonId = @Id; 修改映射文件,添加删除对象的存储过程: <?xml version="1.0" encoding="utf-8" ?> <hiber

二十四、Struts2中的UI标签

二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) 可以使用OGNL表达式 模板: 常量设置的:struts.ui.theme=xhtml 开发中建议设置为struts.ui.theme=simple;

第十四篇 Integration Services:项目转换

本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业智能工具(SSDT-BI)或Visual Studio 2012将我们的第一个SSIS项目转换为SSIS 2012.为什么你想升级我们的SSIS项目到2012?你可能想使用SSIS 2012中的新特性.你可能还希望利用SSIS 2012目录.要使用目录,你的项目必须遵循项目部署模型,我们也将在这篇文

Python之路【第二十四篇】:Python学习路径及练手项目合集

Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Python技术路径中包含入门知识.Python基础.Web框架.基础项目.网络编程.数据与计算.综合项目七个模块.路径中的教程将带你逐步深入,学会如何使用 Python 实现一个博客,桌面词典,微信机器人或网络安全软件等.完成本路径的基础及项目练习,将具备独立的Python开发能力. 完整的Python学