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 )

Last updated