当前位置: 首页 > 后端技术 > Node.js

Nodejs入门--learnyounode课程总结(下)_0

时间:2023-04-03 19:47:15 Node.js

learnyounode13课总结(下)最近对nodejs比较感兴趣,但是无从下手,看的时候感觉很生硬,很无聊直接文档。幸好有热心网友推荐了learnyounode好玩的入门教程系列。下载安装后,真心觉得这些课程的作者们辛苦了,于是决定花几天时间把13课全部刷完。不过下载安装后发现界面全是英文,有些词还是比较难懂,尤其是提示。这里推荐一个learnyounode中文版,翻译了learnyounode的界面并附上答案,对完成教程很有帮助。(当然,不是复制。。。)中文版地址:https://www.kancloud.cn/kancloud/learnyounode/47115lesson1编写一个程序,在终端(stdout)打印“HELLOWORLD”。我们知道,安装完node后,只需要在命令行输入nodeprogram.js,就可以运行该目录下的program.js文件,并输出结果。所以这道题比较简单,我们只需要在js文件中写一行控制台代码即可。program.jsconsole.log("HELLOWORLD")第2课编写一个简单的程序,它接受一个或多个命令行参数并将这些参数的总和打印到终端(stdout)。本题涉及到node内置对象--process。我们可以在命令行输入node进入node命令行模式,然后继续输入console.log(process)查看进程对象的各种属性,包括node版本、运行平台、内置模块、域名和其他信息。根据learnyounode的提示,我们知道需要使用process对象中的argv属性来获取参数信息,它是一个数组。比如在命令行输入nodeprogram.js1,那么argv数组就会是这样的:`['C:\ProgramFiles\nodejs\node.exe','C:\Users\zsai\Desktop\mygit\node\program.js','1']`理解了这个之后,我们就可以回答这个问题了。program.jsvarargvArray=process.argv;varnumArray=argvArray.slice(2,argvArray.length);varsum=0;for(varn=0;n{if(err)抛出错误;letcontent=data.split('\n').length-1;console.log(content);});第5课编写程序打印出指定目录下的文件列表,并使用特定的文件名筛选此列表的扩展名。命令行提供了两个参数,第一个是给定的文件目录路径(如:path/to/dir),第二个参数是要过滤掉的文件的扩展名。例如:如果第二个参数是txt,那么就需要过滤掉那些扩展名为.txt的文件。请注意,第二个参数不会有前导“.”。这个过滤后的列表需要在终端打印出来,每行一个文件。此外,还必须使用异步I/O操作。分析题目,我们可以知道,在这个题目中,我们主要做了两个操作:1.读取给定目录下的所有文件2.解析文件扩展名根据提示,可以对应完成fs和path模块两个操作。fs的readdir方法可以获取目录下的所有文件,path的extname可以获取文件的扩展名,然后通过匹配进行过滤。(不过我自己写的代码中没有引用路径,不如learnyounode提供的标准代码准确)program.jsconstfs=require('fs');constdir=process.argv[2];letext=process.argv[3];if(ext.indexOf('.')===-1){ext='.'+ext;}fs.readdir(dir,'utf-8',(err,data)=>{if(err)throwerr;letfilelist=[];data.forEach((f)=>{if(f.match(ext)){console.log(f);}},this);})lesson6这道题和上一道题一样,不过这次用的是模块。需要创建两个文件来解决此问题。编写程序打印出给定文件目录中包含的文件列表,并按特定文件名后缀过滤列表。这次会提供两个参数,第一个参数是要列出的目录,第二个参数是要过滤的文件扩展名。在终端中打印出过滤后的文件列表(每行一个文件)。此外,必须使用异步I/O。这里有四个模块必须遵守的规则:1.导出一个可以准确接收上述参数的函数。2.当出现错误或有数据时,准确调用回调函数。3.不要更改任何其他内容,例如全局变量或标准输出。4.处理所有可能的错误并将它们传递给回调函数。遵循一些约定的好处是模块可以被任何其他也遵守这些约定的人使用。模块化一直是前端开发者的一个方向,因为封装后的模块更系统化,更方便在项目中引用,复用性更高。个人感觉和面向对象编程有异曲同工之妙。在本题中,我们需要封装一个自己的模块来完成上一题的功能。现在的问题是函数已经存在了,我们怎么把它封装成一个模块,怎么引用它。我们先看提示中的代码:module.exports=function(args){/*...*/}varmymodule=require('./mymodule.js')可以看到我们可以通过module.exports导出一个function方法,通过require获取输出函数赋值给一个变量,方便调用,让这个变量对应模块中的函数,可以直接调用。而且在模块中,我们不仅可以输出一个函数,还可以输出一个变量和一个对象,所以灵活性会很高,非常方便在项目中开发。不过我觉得一个模块文件只能被require一次,所以最好不要输出多个变量,不然调用的时候可能会很麻烦。最好在单个模块文件中输出单个变量或对象,方便调用。(不知道这样理解对不对)PS:模块中的错误处理函数最好写成returecallback(err)的形式;提示中,但不知道是什么原因,希望有人能解答一下。另外,learnyounode的答案中的Array.filter是一种很方便的写法。我以前没注意到。以后我会尝试使用这种方法来过滤数组。program.jsvarreaddirFun=require('./readdir');vardir=process.argv[2];varext=process.argv[3];readdirFun(dir,ext,(err,data)=>{如果(err){console.log(err);}data.forEach(function(f){console.log(f);},this);});readdir.jsconstfs=require('fs');常量路径=require('path');functionReadDir(dir,ext,callback){fs.readdir(dir,(err,data)=>{if(err){returncallback(err);}data=data.filter(function(file){returnpath.extname(file)==='.'+ext})callback(null,data);})}module.exports=ReadDir;lesson7编写程序发起HTTPGET请求,所以请求的URL是第一个命令行参数。然后在终端(stdout)的新行中以字符串的形式打印每个“数据”事件获得的数据。在前端页面发起http请求并获取数据,是每个前端都需要知道和了解的,但是如何在node环境下,或者后台发起http请求,就不是很清楚了。经过提示,我们知道在node中有一个http模块专门处理http请求。在本题中,我们需要使用http模块中的get方法向接口发起get请求,然后获取返回的数据并进行打印。但是和前端的get请求不同的是,回调中的response并不是最终的数据。我们需要对response做各种监听处理,最终的数据就是接口返回的数据,和前端HTTP请求是一样的。数据不一样。按照我的理解,node的http模块发起一个接口请求后,两个接口就建立了一个连续的数据通道。在数据传输过程中,只有触发res.end()事件才会断开通道。因此,我们需要对期间的数据进行收集整合,才能得到完整的数据。(个人理解,希望有人能解释一下)program.jsconsthttp=require('http');constrequrl=process.argv[2];http.get(requrl,(res)=>{res.setEncoding('utf-8');letrawData='';res.on('data',(data)=>{console.log(data);})res.on('error',()=>{console.log(error);})})整理这篇博客也是为了让自己更好的消化从learnyounode吸收的关于nodejs的知识。所提出的某些观点和语法可能存在偏差。如果有人看到它,我希望您能指出来,将不胜感激。由于时间关系,我只整理了前7课的内容。下次有空的时候,我也会把剩下的6节课的内容整理一下,作为我进入node的纪念~