---
tags: learnyounode,
---
# Learnyounode (2022/02/15):
## :memo: todo list
0. Why we use learnyounode, why don't we learn js like we learned Java?
1. What is learnyounode? How it work?
2. Baby Step
3. MY FIRST I/O!
4. MY FIRST ASYNC I/O!
5. FILTERED LS
### 0. Why we use learnyounode, why don't we learn js like we learned Java?
在這堂課中語法不是最重要的,語法只要多用幾次就會熟悉.
這堂課要訓練的能力:
1. 解決問題的能力
2. 思考邏輯能力
3. 找尋解決方法的能力
### 1. What is learnyounode? How it work?
Learnyounode verify filename.js
在執行上面的指令,他會自動傳入預先準備好的參數(隨機,每次不一樣)
### 2. Baby Step
1. process.argv[index] 得到從learnyounode傳來的參數
2. Number() - 將字串轉為數字的方法
例如:Number('5') => 5
3. 將數字加總起來
4. 透過console.log() 將結果輸出
### 3. MY FIRST I/O!
1. fs(file-system) Node.js 提供的library,主要用來做檔案的IO(讀寫)
2. readFileSync,fs中用來讀取檔案的function,接受格式為string 的檔案路徑當作參數,而回傳的事`Buffer` 格式的物件,`Buffer` 就是檔案和文字轉換過程中的一種型態.
例如:先把水結凍變成冰塊,再把冰塊拿去變成刨冰,Buffer就像過程中的冰塊型態
Buffer.toString() 就可以把Buffer轉換成 String
3. split function 是string自有的function
Ex: "1,2,3,4,5".split(",") => ['1','2','3','4','5']
4. '\n' 這在JS中代表換行符號,在大部分的程式中都是換行符號的意思。
Ex:
```
慈母手中線
遊子身上衣
臨行密密縫
意恐遲遲歸
```
會變成
```
慈母手中線\n遊子身上衣\n臨行密密縫\n意恐遲遲歸
```
陷阱:最後一行沒有換行符號
本題題目求總共幾個換行符號
### 4. MY FIRST ASYNC I/O!
asynchronous function: 非同步函式 就像是 100公尺賽跑
synchronous function: 同步函式 就像是 接力賽跑
1. fs.readFile()
2.
```
fs.readFile(path, 'utf-8', function callback(err, data){
// 此function 叫做 callback function(回呼函式)
// 執行完某項任務後會調用(呼叫)的函式 叫做 callback function
// 在這裡是當檔案讀取完成會呼叫此function
// path是檔案路徑
// utf-8 是編碼格式,沒放的話 data就是回傳Buffer,有放的話就回傳字串
})
```
### 5. FILTERED LS
```
fs.readdir(path, function callback(err, data){
//data => [index.html, lababa.mp3, damn.avi]
})
```
1. path(路徑) Node.js 提供的library,對路徑字串做操作
https://nodejs.org/api/path.html
https://pjchender.dev/nodejs/node-path/
2. path.extname('index.html') = > '.html'
3. 陷阱:題目直接給副檔名ex: 'mp3',不會給'.mp3'
ref: http://nodejs.cn/api/path.html#pathextnamepath
### 6. MAKE IT MODULAR
自己做一個module
1. Export a single function that takes exactly the arguments described.
2. Call the callback exactly once with an error or some data as described.
3. Don't change anything else, like global variables or stdout.
4. Handle all the errors that may occur and pass them to the callback.
//04_make_it_modual.js
```javascript=
const myModule = require('./mymodule.js');
const dir = process.argv[2];
const ext = process.argv[3];
myModule(dir, ext, function(err, list){
if(err) return console.err(err);
for(let i = 0; i<=list.length -1; i++){
console.log(list[i])
}
})
```
//mymodule.js
```javascript=
const fs = require('fs')
const path = require('path')
function result(pathName, extFile, callback) {
fs.readdir(pathName, function (err, data) {
if (err) { return callback(err) }
const list = [];
for (let i = 0; i < data.length; i++) {
if (path.extname(data[i]) === "." + extFile) {
list.push(data[i])
}
}
callback(null, list)
})
}
module.exports = result
```