Egret入门学习日记 --- 第六十四篇(书中 19.4 节 内容)
Posted dmc-nero
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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. > images@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 images@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节 结束。
吃饭。
以上是关于Egret入门学习日记 --- 第六十四篇(书中 19.4 节 内容)的主要内容,如果未能解决你的问题,请参考以下文章
Egret入门学习日记 --- 第三十六篇(书中 10.7 ~ 10.8 节 内容)
Egret入门学习日记 --- 第二十二篇(书中 9.7~9.8 节 内容)
Egret入门学习日记 --- 第二十三篇(书中 9.9~9.11 节 内容)