国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

nodejs 初入--learnyounode課程總結(上)

masturbator / 1606人閱讀

摘要:編寫一個簡單的程序,使其能接收一個或者多個命令行參數,并且在終端標準輸出中打印出這些參數的總和。處理所有可能發生的錯誤,并把它們傳遞給回調函數。編寫一個程序來發起一個請求,所請求的為命令行參數的第一個。

learnyounode 13課總結(上)

最近對nodejs比較感興趣,但是苦于無法下手,直接啃文檔又覺得十分生硬無趣。
幸好有熱心網友推薦了learnyounode這個好玩的入門課程系列,在下載安裝之后確實覺得這幾篇課程作者做的很用心,于是決定花幾天時間把13課通關。
不過下載安裝之后,發現界面都是全英文的,有些詞匯還是比較難懂的,特別是提示的方面。
這里推薦一篇learnyounode的漢化版,它將learnyounode的界面翻譯并附出了答案,對于完成教程還是很有幫助的。(當然,不是抄。。。)
中文版地址:https://www.kancloud.cn/kancloud/learnyounode/47115

lesson 1
編寫一個程序,在終端(標準輸出 stdout)打印出 “HELLO WORLD”。

我們知道,在安裝node之后,我們只要在命令行輸入 node program.js 就可以運行該目錄下的program.js文件,并輸出結果。
所以此題較為簡單,我們只要在js文件里寫一行console代碼就行。

program.js

console.log("HELLO WORLD")
lesson 2
編寫一個簡單的程序,使其能接收一個或者多個命令行參數,并且在終端(標準輸出 stdout)中打印出這些參數的總和。

在本題中,涉及到了node的內置對象--process。
我們可以在命令行中輸入node,進入node命令行模式,然后繼續輸入 console.log(process) 來查看process對象的各個屬性,包括node版本、運行平臺、內置模塊、域名等各個信息。
根據learnyounode的提示,我們知道,獲取參數信息需要用到process對象中的argv屬性,它是一個數組。
例如在命令行中輸入 node program.js 1 ,那么argv數組將會是這樣的:`[ "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;n
lesson 3
編寫一個程序,執行一個同步的文件系統操作,讀取一個文件,并且在終端(標準輸出stdout)打印出這個文件中的內容的行數。類似于執行 cat file | wc -l 這個命令。
所要讀取的文件的完整路徑會在命令行第一個參數提供。

首先我們先在當前目錄下,創建一個test.txt文件,然后輸入幾行文字,保存之后,在命令行中輸入 cat test.txt ,然后在命令行中就會輸出test.txt中的內容,這與我們所要做的事情類似。
在本題中,我們要用node同步打開一個文件,并計算文件中內容的行數。這里我們需要用到node的內置模塊--fs,只有在引入fs之后,我們利用node進行相應的文件操作。
翻閱node文檔中的fs模塊,可以知道打開文件所需要用的方法有readFile和readFileSync,根據要求,我們需要同步讀取文件,故采用readFileSync。
填入路徑,確定解碼方法(也可以用toString方法將讀取的內容轉為字符串)之后,我們就可以得到文件的內容了,然后通過讀取"n"的個數我們就可以知道有幾行文本,整個題目差不多就可以完成了~

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
編寫一個程序,執行一個異步的對文件系統的操作:讀取一個文件,并且在終端(標準輸出stdout)打印出這個文件中的內容的行數。類似于執行 cat file | wc -l 這個命令。 
所要讀取的文件的完整路徑會在命令行第一個參數提供。

這題與上題大同小異,唯一不同的是本題要求用異步讀取的方法讀取文件,即調用readFile方法。
值得注意的是,既然是異步方法,就需要寫回調函數,而既然是回調函數,就要考慮讀取出錯的情況,即需要增加對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
編寫一個程序來打印出指定目錄下的文件列表,并且以特定的文件名擴展名來過濾這個列表。命令行提供兩個參數提,第一個是所給的文件目錄路徑(如:path/to/dir),第二個參數則是需要過濾出來的文件的擴展名。
舉個例子:如果第二個參數是 txt,那么需要過濾出那些擴展名為 .txt的文件。
注意,第二個參數將不會帶有開頭的”.”。
需要在終端中打印出這個被過濾出來的列表,每一行一個文件。另外,必須使用異步的I/O 操作。

分析題目,我們可以知道在本題中,我們最主要的是做兩個操作:1、讀取給定目錄下的所有文件 2、解析文件的擴展名
根據提示,fs和path兩個模塊可以對應完成兩個操作。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
這個問題和前面一個一樣,但是這次需要使用模塊。將需要創建兩個文件來解決這個問題。
編寫一個程序來打印出所給文件目錄的所含文件的列表,并且以特定的文件名后綴來過濾這個列表。這次將會提供兩個參數,第一個參數是要列舉的目錄,第二個參數是要過濾的文件擴展名。在終端中打印出過濾出來的文件列表(一個文件一行)。此外,必須使用異步 I/O。
這里有四則規定,模塊必須遵守:
    1.導出一個函數,這個函數能準確接收上述的參數。
    2.當有錯誤發生,或者有數據的時候,準確調用回調函數。
    3.不要改變其他的任何東西,比如全局變量或者 stdout。
    4.處理所有可能發生的錯誤,并把它們傳遞給回調函數。
遵循一些約定的好處是,模塊可以被任何其他也遵守這些約定的人所使用。

模塊化一直是前端開發者努力的一個方向,因為被封裝后的模塊更為系統,在項目中的引用也更為便利,復用性更高,個人感覺和面向對象編程有異曲同工之妙。
在本題中,我們需要封裝一個自己的模塊,來完成上一題的功能。現在的問題就是,功能已經有了,我們怎么將它封裝到模塊里,又怎么去引用。
我們首先來看一下提示中的代碼:
module.exports = function (args) { /* ... */ }
var mymodule = require("./mymodule.js")
我們可以看到,我們可以通過 module.exports 將一個函數方法輸出,并通過 require 將輸出的函數獲取并賦值給某個變量便于調用,這樣這個變量就對應模塊中的函數,并可以直接被調用了。
而且在模塊中,我們不僅可以輸出一個函數,還可以輸出一個變量、一個對象,因此靈活度將會很高,十分便于在項目中開發。
不過我覺得,一個模塊文件只能被require一次,所以最好不要輸出多個變量,不然在調用的時候可能會比較麻煩,最好是單一模塊文件輸出單個變量或對象,便于調用。(不知道這樣理解對不對)
PS:模塊中的錯誤處理函數最好根據提示中的 reture callback(err); 這種形式來寫,不過我不知道原因,希望有大神解答。還有learnyounode答案中的Array.filter是一個很方便的寫法,以前一直沒有注意到,以后會試著用這個方法來做數組的過濾的。

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
編寫一個程序來發起一個 HTTP GET 請求,所請求的 URL 為命令行參數的第一個。然后將每一個 “data” 事件所得的數據,以字符串形式在終端(標準輸出 stdout)的新的一行打印出來。

在前端頁面中發起http請求并獲取數據是每個前端都需要知道和了解的,但是如何在node環境下,或者說在后臺中發起http請求就不是很了解了。
經過提示,我們知道node中有個http模塊是專門處理http請求的,在本題中,我們需要用http模塊中的get方法,來對接口發起get請求,然后得到返回數據并打印。
但是跟前端的get請求不太一樣的是,在回調中的response并不是最終的數據,我們需要對response做各種監聽處理,最終得到的數據才是接口返回的數據,這和前端http請求返回的數據不太一樣。
按我的理解是,node的http模塊在發起接口請求之后,兩個接口建立起持續的數據通道,數據傳輸期間,通道不會斷開,知道觸發 res.end() 事件。所以我們需要對期間的數據進行收集整合,才能得到完整的數據。(個人理解,希望有大神解惑)

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中吸收的關于nodejs的知識,其中對提出的一些觀點和語法可能存在偏差,如果有大神看到的話,希望能指出,不勝感激。由于時間關系,只整理了前7課的內容,等到下次有空的時間,將剩余6課的內容也一并整理出來,當作自己入node的紀念~

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89155.html

相關文章

  • nodejs 初入--learnyounode課程總結(下)

    摘要:然而,這一次,將有三個作為前三個命令行參數提供。編寫一個時間服務器服務器監聽一個端口,以獲取一些連接,這個端口會經由第一個命令行參數傳遞給程序。 learnyounode 13課總結(下) 前斷時間較為忙碌,所以learnyounode的下半部分總結一直拖到了現在,罪過罪過。那么今天我就將8-13課的內容整理出來,將后半部分的知識稍微梳理一下。 這里推薦一篇learnyounode...

    shusen 評論0 收藏0
  • 工作4年后的一些思考

    摘要:面對正在跑步進入大齡程序員隊列的我,對過去有一些思考總結,同時對未來也有一些想法。現在想來大學時候最錯誤的決定就是學嵌入式,從后來找工作來看它的熱度根本不如應用軟件開發,并且物聯網也并沒有大熱,或許時代會真正迎來。15年畢業,算上實習經歷差不多有四年半的工作經驗。沒想到時間過得這么快,有時候還覺得跟剛畢業一樣。之前在創業公司呆過兩年半,目前在阿里做大數據/算法相關的工作。這四年來收獲過成功的...

    lauren_liuling 評論0 收藏0
  • 基于nodejs編寫小爬蟲

    摘要:編寫異步小爬蟲在通過的課程初步了解的各大模塊之后,不禁感慨于的強大,讓我們這些前端小白也可以進行進階的功能實現,同時發現自己也已經可以通過實現一些比較日常的小功能。 nodejs編寫異步小爬蟲 在通過learnyounode的課程初步了解nodejs的各大模塊之后,不禁感慨于nodejs的強大,讓我們這些前端小白也可以進行進階的功能實現,同時發現自己也已經可以通過nodejs實現一些...

    3fuyu 評論0 收藏0
  • iKcamp團隊制作|基于Koa2搭建Node.js實戰項目教學(含視頻)? 環境準備

    安裝搭建項目的開發環境 視頻地址:https://www.cctalk.com/v/15114357764004 showImg(https://segmentfault.com/img/remote/1460000012470016?w=1214&h=718); 文章 Koa 起手 - 環境準備 由于 koa2 已經開始使用 async/await 等新語法,所以請保證 node 環境在 7.6...

    bang590 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<