摘要:編寫一個簡單的程序,使其能接收一個或者多個命令行參數(shù),并且在終端標準輸出中打印出這些參數(shù)的總和。處理所有可能發(fā)生的錯誤,并把它們傳遞給回調(diào)函數(shù)。編寫一個程序來發(fā)起一個請求,所請求的為命令行參數(shù)的第一個。
learnyounode 13課總結(jié)(上)
最近對nodejs比較感興趣,但是苦于無法下手,直接啃文檔又覺得十分生硬無趣。
幸好有熱心網(wǎng)友推薦了learnyounode這個好玩的入門課程系列,在下載安裝之后確實覺得這幾篇課程作者做的很用心,于是決定花幾天時間把13課通關(guān)。
不過下載安裝之后,發(fā)現(xiàn)界面都是全英文的,有些詞匯還是比較難懂的,特別是提示的方面。
這里推薦一篇learnyounode的漢化版,它將learnyounode的界面翻譯并附出了答案,對于完成教程還是很有幫助的。(當然,不是抄。。。)
中文版地址:https://www.kancloud.cn/kancloud/learnyounode/47115
編寫一個程序,在終端(標準輸出 stdout)打印出 “HELLO WORLD”。
我們知道,在安裝node之后,我們只要在命令行輸入 node program.js 就可以運行該目錄下的program.js文件,并輸出結(jié)果。
所以此題較為簡單,我們只要在js文件里寫一行console代碼就行。
program.js
console.log("HELLO WORLD")lesson 2
編寫一個簡單的程序,使其能接收一個或者多個命令行參數(shù),并且在終端(標準輸出 stdout)中打印出這些參數(shù)的總和。
在本題中,涉及到了node的內(nèi)置對象--process。
我們可以在命令行中輸入node,進入node命令行模式,然后繼續(xù)輸入 console.log(process) 來查看process對象的各個屬性,包括node版本、運行平臺、內(nèi)置模塊、域名等各個信息。
根據(jù)learnyounode的提示,我們知道,獲取參數(shù)信息需要用到process對象中的argv屬性,它是一個數(shù)組。
例如在命令行中輸入 node program.js 1 ,那么argv數(shù)組將會是這樣的:`[ "C:Program Files
odejs
ode.exe",
"C:UserszsaiDesktopmygit
odeprogram.js",
"1" ]`
了解這個之后,我們就可以解答本題了。
program.js
var argvArray=process.argv; var numArray=argvArray.slice(2,argvArray.length); var sum=0; for(var n=0;nlesson 3 編寫一個程序,執(zhí)行一個同步的文件系統(tǒng)操作,讀取一個文件,并且在終端(標準輸出stdout)打印出這個文件中的內(nèi)容的行數(shù)。類似于執(zhí)行 cat file | wc -l 這個命令。 所要讀取的文件的完整路徑會在命令行第一個參數(shù)提供。首先我們先在當前目錄下,創(chuàng)建一個test.txt文件,然后輸入幾行文字,保存之后,在命令行中輸入 cat test.txt ,然后在命令行中就會輸出test.txt中的內(nèi)容,這與我們所要做的事情類似。
在本題中,我們要用node同步打開一個文件,并計算文件中內(nèi)容的行數(shù)。這里我們需要用到node的內(nèi)置模塊--fs,只有在引入fs之后,我們利用node進行相應(yīng)的文件操作。
翻閱node文檔中的fs模塊,可以知道打開文件所需要用的方法有readFile和readFileSync,根據(jù)要求,我們需要同步讀取文件,故采用readFileSync。
填入路徑,確定解碼方法(也可以用toString方法將讀取的內(nèi)容轉(zhuǎn)為字符串)之后,我們就可以得到文件的內(nèi)容了,然后通過讀取"n"的個數(shù)我們就可以知道有幾行文本,整個題目差不多就可以完成了~program.js
const fs = require("fs"); const { Url } = require("url"); let content=fs.readFileSync(absUrl).toString(); let lineArray=content.split(" "); console.log(lineArray.length-1);lesson 4編寫一個程序,執(zhí)行一個異步的對文件系統(tǒng)的操作:讀取一個文件,并且在終端(標準輸出stdout)打印出這個文件中的內(nèi)容的行數(shù)。類似于執(zhí)行 cat file | wc -l 這個命令。 所要讀取的文件的完整路徑會在命令行第一個參數(shù)提供。這題與上題大同小異,唯一不同的是本題要求用異步讀取的方法讀取文件,即調(diào)用readFile方法。
值得注意的是,既然是異步方法,就需要寫回調(diào)函數(shù),而既然是回調(diào)函數(shù),就要考慮讀取出錯的情況,即需要增加對err的處理。program.js
const fs = require("fs"); const absUrl=process.argv[2]; fs.readFile(absUrl,"utf-8", (err, data) => { if (err) throw err; let content=data.split(" ").length-1; console.log(content); });lesson 5編寫一個程序來打印出指定目錄下的文件列表,并且以特定的文件名擴展名來過濾這個列表。命令行提供兩個參數(shù)提,第一個是所給的文件目錄路徑(如:path/to/dir),第二個參數(shù)則是需要過濾出來的文件的擴展名。 舉個例子:如果第二個參數(shù)是 txt,那么需要過濾出那些擴展名為 .txt的文件。 注意,第二個參數(shù)將不會帶有開頭的”.”。 需要在終端中打印出這個被過濾出來的列表,每一行一個文件。另外,必須使用異步的I/O 操作。分析題目,我們可以知道在本題中,我們最主要的是做兩個操作:1、讀取給定目錄下的所有文件 2、解析文件的擴展名
根據(jù)提示,fs和path兩個模塊可以對應(yīng)完成兩個操作。fs的readdir方法可以獲取目錄下的所有文件,而通過path的extname可以獲取獲得file的擴展名,再通過匹配即可進行篩選。(不過在我自己寫的代碼中我未引用path,在準確度上比不上learnyounode提供的標準代碼)program.js
const fs = require("fs"); const dir=process.argv[2]; let ext=process.argv[3]; if(ext.indexOf(".")===-1){ ext="."+ext; } fs.readdir(dir,"utf-8",(err,data) => { if(err) throw err; let filelist = []; data.forEach((f) => { if(f.match(ext)){ console.log(f); } }, this); })lesson 6這個問題和前面一個一樣,但是這次需要使用模塊。將需要創(chuàng)建兩個文件來解決這個問題。 編寫一個程序來打印出所給文件目錄的所含文件的列表,并且以特定的文件名后綴來過濾這個列表。這次將會提供兩個參數(shù),第一個參數(shù)是要列舉的目錄,第二個參數(shù)是要過濾的文件擴展名。在終端中打印出過濾出來的文件列表(一個文件一行)。此外,必須使用異步 I/O。 這里有四則規(guī)定,模塊必須遵守: 1.導(dǎo)出一個函數(shù),這個函數(shù)能準確接收上述的參數(shù)。 2.當有錯誤發(fā)生,或者有數(shù)據(jù)的時候,準確調(diào)用回調(diào)函數(shù)。 3.不要改變其他的任何東西,比如全局變量或者 stdout。 4.處理所有可能發(fā)生的錯誤,并把它們傳遞給回調(diào)函數(shù)。 遵循一些約定的好處是,模塊可以被任何其他也遵守這些約定的人所使用。模塊化一直是前端開發(fā)者努力的一個方向,因為被封裝后的模塊更為系統(tǒng),在項目中的引用也更為便利,復(fù)用性更高,個人感覺和面向?qū)ο缶幊逃挟惽ぶ睢?
在本題中,我們需要封裝一個自己的模塊,來完成上一題的功能?,F(xiàn)在的問題就是,功能已經(jīng)有了,我們怎么將它封裝到模塊里,又怎么去引用。
我們首先來看一下提示中的代碼:
module.exports = function (args) { /* ... */ }
var mymodule = require("./mymodule.js")
我們可以看到,我們可以通過 module.exports 將一個函數(shù)方法輸出,并通過 require 將輸出的函數(shù)獲取并賦值給某個變量便于調(diào)用,這樣這個變量就對應(yīng)模塊中的函數(shù),并可以直接被調(diào)用了。
而且在模塊中,我們不僅可以輸出一個函數(shù),還可以輸出一個變量、一個對象,因此靈活度將會很高,十分便于在項目中開發(fā)。
不過我覺得,一個模塊文件只能被require一次,所以最好不要輸出多個變量,不然在調(diào)用的時候可能會比較麻煩,最好是單一模塊文件輸出單個變量或?qū)ο?,便于調(diào)用。(不知道這樣理解對不對)
PS:模塊中的錯誤處理函數(shù)最好根據(jù)提示中的 reture callback(err); 這種形式來寫,不過我不知道原因,希望有大神解答。還有l(wèi)earnyounode答案中的Array.filter是一個很方便的寫法,以前一直沒有注意到,以后會試著用這個方法來做數(shù)組的過濾的。program.js
var readdirFun = require("./readdir"); var dir = process.argv[2]; var ext = process.argv[3]; readdirFun(dir,ext,(err,data) => { if(err){ console.log(err); } data.forEach(function(f) { console.log(f); }, this); });readdir.js
const fs = require("fs"); const path = require("path"); function ReadDir(dir, ext, callback) { fs.readdir(dir, (err, data) => { if (err) { return callback(err); } data = data.filter(function (file) { return path.extname(file) === "." + ext }) callback(null, data); }) } module.exports = ReadDir;lesson 7編寫一個程序來發(fā)起一個 HTTP GET 請求,所請求的 URL 為命令行參數(shù)的第一個。然后將每一個 “data” 事件所得的數(shù)據(jù),以字符串形式在終端(標準輸出 stdout)的新的一行打印出來。在前端頁面中發(fā)起http請求并獲取數(shù)據(jù)是每個前端都需要知道和了解的,但是如何在node環(huán)境下,或者說在后臺中發(fā)起http請求就不是很了解了。
經(jīng)過提示,我們知道node中有個http模塊是專門處理http請求的,在本題中,我們需要用http模塊中的get方法,來對接口發(fā)起get請求,然后得到返回數(shù)據(jù)并打印。
但是跟前端的get請求不太一樣的是,在回調(diào)中的response并不是最終的數(shù)據(jù),我們需要對response做各種監(jiān)聽處理,最終得到的數(shù)據(jù)才是接口返回的數(shù)據(jù),這和前端http請求返回的數(shù)據(jù)不太一樣。
按我的理解是,node的http模塊在發(fā)起接口請求之后,兩個接口建立起持續(xù)的數(shù)據(jù)通道,數(shù)據(jù)傳輸期間,通道不會斷開,知道觸發(fā) res.end() 事件。所以我們需要對期間的數(shù)據(jù)進行收集整合,才能得到完整的數(shù)據(jù)。(個人理解,希望有大神解惑)program.js
const http = require("http"); const requrl = process.argv[2]; http.get(requrl, (res) => { res.setEncoding("utf-8"); let rawData = ""; res.on("data", (data) => { console.log(data); }) res.on("error", () => { console.log(error); }) })整理這篇博客也是為了讓自己更好的消化從learnyounode中吸收的關(guān)于nodejs的知識,其中對提出的一些觀點和語法可能存在偏差,如果有大神看到的話,希望能指出,不勝感激。由于時間關(guān)系,只整理了前7課的內(nèi)容,等到下次有空的時間,將剩余6課的內(nèi)容也一并整理出來,當作自己入node的紀念~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/89155.html
摘要:然而,這一次,將有三個作為前三個命令行參數(shù)提供。編寫一個時間服務(wù)器服務(wù)器監(jiān)聽一個端口,以獲取一些連接,這個端口會經(jīng)由第一個命令行參數(shù)傳遞給程序。 learnyounode 13課總結(jié)(下) 前斷時間較為忙碌,所以learnyounode的下半部分總結(jié)一直拖到了現(xiàn)在,罪過罪過。那么今天我就將8-13課的內(nèi)容整理出來,將后半部分的知識稍微梳理一下。 這里推薦一篇learnyounode...
摘要:面對正在跑步進入大齡程序員隊列的我,對過去有一些思考總結(jié),同時對未來也有一些想法?,F(xiàn)在想來大學(xué)時候最錯誤的決定就是學(xué)嵌入式,從后來找工作來看它的熱度根本不如應(yīng)用軟件開發(fā),并且物聯(lián)網(wǎng)也并沒有大熱,或許時代會真正迎來。15年畢業(yè),算上實習(xí)經(jīng)歷差不多有四年半的工作經(jīng)驗。沒想到時間過得這么快,有時候還覺得跟剛畢業(yè)一樣。之前在創(chuàng)業(yè)公司呆過兩年半,目前在阿里做大數(shù)據(jù)/算法相關(guān)的工作。這四年來收獲過成功的...
摘要:編寫異步小爬蟲在通過的課程初步了解的各大模塊之后,不禁感慨于的強大,讓我們這些前端小白也可以進行進階的功能實現(xiàn),同時發(fā)現(xiàn)自己也已經(jīng)可以通過實現(xiàn)一些比較日常的小功能。 nodejs編寫異步小爬蟲 在通過learnyounode的課程初步了解nodejs的各大模塊之后,不禁感慨于nodejs的強大,讓我們這些前端小白也可以進行進階的功能實現(xiàn),同時發(fā)現(xiàn)自己也已經(jīng)可以通過nodejs實現(xiàn)一些...
安裝搭建項目的開發(fā)環(huán)境 視頻地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 環(huán)境準備 由于 koa2 已經(jīng)開始使用 async/await 等新語法,所以請保證 node 環(huán)境在 7.6...
閱讀 2973·2021-10-28 09:32
閱讀 3016·2021-10-11 10:57
閱讀 3183·2021-10-08 10:05
閱讀 2666·2021-09-28 09:36
閱讀 2258·2019-08-30 15:55
閱讀 2298·2019-08-30 15:44
閱讀 2423·2019-08-30 14:02
閱讀 3102·2019-08-29 17:16