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
Was this helpful?