Front2End
  • Introduction
  • Front
    • Introduction
    • 新手入門
    • 相關連結
    • Css
    • Javascript
    • 立即函式
    • Google SpreadSheet 當資料庫
    • 資料視覺化
    • 新年快樂
    • Google御用網頁語言 Node.js
    • 世大運網頁遊戲腳本
    • YDNJS-1.Up&Going
    • YDNJS
    • 新手入門
  • 實做
    • 程式碼片段蒐集
    • 爬蟲
    • 實做: 貪吃蛇
    • 練習: z=ax+by
    • 實做: 爬八卦版的文章
    • LearnYouNode
      • 3 - 同步 IO 讀寫
      • 4 – My First Async I\/O
      • 5 - filter
      • 6 - Make it Modular
      • 7-Http Client
    • road_to_bookdown
    • FreeCodeCamp
  • End
    • node.js
Powered by GitBook
On this page

Was this helpful?

  1. 實做
  2. LearnYouNode

6 - Make it Modular

這個題目如果我沒先偷看答案的話,真的是完全沒有概念啊 ...,所以我偷看了(茶)

第六題和第五題要求差不多,都是要篩選資料夾中有某個副檔名的檔案出來。這題要拆成兩個檔案,一個是主要用來執行的 js 檔,一個是變成模組、用來讓執行的 js 載入的檔案

首先是執行程式。執行程式一開始要先設定三個東西:

  • 載入負責 filter 的模組

  • 抓取 node MakeModule dir filterstr的第二個參數,也就是 dir

  • 抓取 node MakeModule dir filterstr的第三個參數,也就是 filterstr

之後,就是利用 filterFn 塞選出有 filterStr 的檔案,再一個一個印出在此 list 裡面的 file 檔名

// 主程式,要載入 filter 的模組

var filterFn = require( './6-myModule.js' )
var dir = process.argv[2]
var filterStr = process.argv[3]


// 執行 filterFn 函式 

filterFn ( dir, filterStr, function ( err, list ) {

    // 報錯
    if (err)
        return console.error( "There was an error:", err )

    // 列印符合的篩選檔案
    list.forEach ( function (file) {
        console.log(file)
    })
}  
)

模組的部份,目的是要篩選出某個資料夾中,符合某個副檔名的全部檔案

首先要得到某個資料夾的全部清單,而這可以透過 fs.readdir( dir, filterstr, callback) 函式找到。為此,我們要

  • 載入 fs 模組: fs = require('fs')

  • 了解 fs.readdir 的參數有 ( dir, fuction(err, list) )

再來,要進行實質的篩選。官方解答提供了一個篩選函式: Array.filter( function(){condition} )。所以接下來要

  • 先建立一個可以傳到執行程式的 var file = list.filter( function(){} )

  • 在 callback 函式為 file 設定條件並傳回: return path.extname( file ) == ( "."+ filterStr )

最後,要把整個程式包成 module 方便外包出去,讓執行程式可以使用,而也要能接受來自執行程式的參數: dir, filterStr

  • module.exports = function ( dir, filterStr, callback ){ }

// filter 的模組 

var fs = require('fs')
var path = require('path')

module.exports = function ( dir, filterStr, callback ){

    fs.readdir( dir, function(err, list) {

        // 如果錯,就報錯    
        if (err)
            return callback(err)

        // filter file has ext
        list = list.filter(function (file) {
            return path.extname( file ) == ( "."+ filterStr )  
        } )

        // callback    
        callback(null, list)
    })

}

Array.forEach(callback)

Array.filter(callback )

Previous5 - filterNext7-Http Client

Last updated 5 years ago

Was this helpful?

learnyounode Lesson 6 – Make it Modular | Joe Creager
Array.prototype.forEach() - JavaScript | MDN
Array.prototype.filter() - JavaScript | MDN
Mr.Q 程式手劄: 讓 Vim 跟與你的系統剪貼簿 (clipboard) 共舞
Vim 中如何全選複制粘貼 - 造夢先森 Kai 的專欄 - 博客頻道 - CSDN.NET
[VIM] 如何做全選 + 複製 - Mr. 一顆痣 a.k.a. bigd - 工程屍的日子