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