這個問題和前面一個一樣,但是這次需要使用模塊。將需要創(chuàng)建兩個文件來解決這個問題。
編寫一個程序來打印出所給文件目錄的所含文件的列表,并且以特定的文件名后綴來過濾這個列表。這次將會提供兩個參數(shù),第一個參數(shù)是要列舉的目錄,第二個參數(shù)是要過濾的文件擴展名。在終端中打印出過濾出來的文件列表(一個文件一行)。此外,必須使用異步 I/O。
需要編寫一個模塊文件去做大部分的事情。這個模塊必須導出(export)一個函數(shù),這個函數(shù)將接收三個參數(shù):目錄名、文件擴展名、回調(diào)函數(shù),并按此順序傳遞。文件擴展名必須和傳遞給程序的擴展名字符串一模一樣。也就是說,請不要把它轉(zhuǎn)成正則表達式或者加上”.”前綴或者做其他的處理,而是直接傳到模塊中去,在模塊中,可以做一些處理來使過濾器能正常工作。
這個回調(diào)函數(shù)必須以 Node 編程中慣用的約定形式(err,data)去調(diào)用。這個約定指明了,除非發(fā)生了錯誤,否則所傳進去給回調(diào)函數(shù)的第一個參數(shù)將會是 null,第二個參數(shù)才會是數(shù)據(jù)。在本題中,這個數(shù)據(jù)將會是過濾出來的文件列表,并且是以數(shù)組的形式。如果接收到了一個錯誤,如:來自fs.readdir()
?的錯誤,則必須將這個錯誤作為第一個,也是唯一的參數(shù)傳遞給回調(diào)函數(shù),并執(zhí)行回調(diào)函數(shù)。
絕對不能直接在模塊文件中把結(jié)果打印到終端中,只能在原始程序文件中編寫打印結(jié)果的代碼。
當程序接收到一些錯誤的時候,請簡單的捕獲它們,并且在終端中打印出相關(guān)的信息
這里有四則規(guī)定,模塊必須遵守:
遵循一些約定的好處是,模塊可以被任何其他也遵守這些約定的人所使用。
通過創(chuàng)建一個僅包含目錄讀取和文件過濾相關(guān)的函數(shù)的文件來建立一個新的模塊。要使模塊導出(export)單一函數(shù)(single function),可以將函數(shù)賦值給module.exports
對象:
module.exports = function (args) { /* ... */ }
或者也可以使用命名函數(shù),然后把函數(shù)名賦值給module.exports
。
要在原來的程序中使用新的模塊,請用 require() 載入模塊,這和載入 fs 模塊時候用require('fs')
一樣,唯一的區(qū)別在于本地模塊需要加上 ‘./‘ 這個相對路徑前綴。所以,如果模塊文件名字是 mymodule.js,那么需要像這樣寫:
var mymodule = require('./mymodule.js')
‘.js’ 這個文件擴展名通常是可以省略的。
現(xiàn)在,mymodule 這個變量就指向了模塊中 module.exports了,因為剛導出了一個單一的函數(shù),所以現(xiàn)在所聲明的變量 mymodule 就是那個模塊所導出的函數(shù)了,就可以直接調(diào)用它了!
同樣,請記住,盡早捕獲錯誤,并且在回調(diào)中返回:
function bar (callback) {
foo(function (err, data) {
if (err)
return callback(err) // 盡早返回錯誤
// ... 沒有錯誤,處理 `data`
// 一切順利,傳遞 null 作為 callback 的第一個參數(shù)
callback(null, data)
})
}
var filterFn = require('./solution_filter.js')
var dir = process.argv[2]
var filterStr = process.argv[3]
filterFn(dir, filterStr, function (err, list) {
if (err)
return console.error('There was an error:', err)
list.forEach(function (file) {
console.log(file)
})
})
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)
list = list.filter(function (file) {
return path.extname(file) === '.' + filterStr
})
callback(null, list)
})
}
更多建議: