# Web企業運算_Week2_許家維
# **練習清單**
1. 上課內容
* node fs文件管理系統
* node Express框架
* Javascript 錯誤處理
2. 購買網域 & 虛擬伺服器相關資料
3. 切版練習 - 個人履歷網站(Bootstrap + Jquery)
4. 技術文章 : avaScript - JavaScript 變數與資料型別
https://ithelp.ithome.com.tw/articles/10216831
# **程式**
* 非同步讀取 fs.readFile()
* 同步讀取 fs.readFileSync('檔名');
```
// 使用fs模塊
var fs = require('fs');
// 非同步讀取
fs.readFile('input.txt',function(err,data){
// (err) => (err == true)
if(err)
// 輸出錯誤訊息至控制台
return console.error(err);
// 傳回目前文件內的字串
console.log("非同步讀取 - " + data.toString());
})
// 同步讀取
var data = fs.readFileSync('input.txt');
console.log("同步讀取 - " + data.toString());
console.log("Read ended");
```
執行結果
```
PS C:\Users\家維\Desktop\node0310> node week2_1.js
同步讀取 - 國立彰化師範大學
Read ended
非同步讀取 - 國立彰化師範大學
```
**查看目前目錄與檔案**
```
// 目前目錄名稱
console.log(__dirname);
// 目前檔案名稱
console.log(__filename);
```
執行結果
```
C:\Users\家維\Desktop\node0310
C:\Users\家維\Desktop\node0310\week2_1.js
```
**設定延遲時間**
```
// setTimeout() : 執行完才會執行下一次
let i = 1;
setTimeout(()=>{
i = i * 2 ;
console.log(i);
},1000);
// setInterval() : 一個還沒做完就會做下一次
let j = 2048 ;
setInterval(()=>{
j = j / 2;
console.log(j);
},1500);
```
執行結果
```
2
1024
512
256
128
64
32
16
```
**Express 框架**
* npm install express -g (Global)
* npm install express (Location)
```
// 使用express模塊
var express = require('express');
var app = express();
// req : 表示 HTTP 請求,包含請求查詢字串,參數,内容,HTTP 頭部等属性
// res : response 表示 HTTP 的回應,即在接收到請求時向客户端發送的 HTTP 回應數據
var server = app.listen(8081,()=>{
console.log("Hello Express Server");
var host = server.address().address
var port = server.address().port
console.log("http://%s:%s", host, port)
// 此時可用http://120.0.0.1:8081進入頁面
});
// 主頁面輸出
app.get('/',function(req,res) {
console.log("這裡是首頁");
res.send("這裡是首頁");
});
// 其他頁面
app.get('/about', function (req, res) {
console.log("/about");
res.send('關於頁面');
});
// 匹配/user/jacky”網址,網址中的jacky將被捕獲,作為req.params.who屬性的值
app.get('/user/:id',(req,res) =>{
res.send(req.params.id);
});
```
執行結果
```
Hello Express Server
http://:::8081
```
建**立一表單頁面,並將使用者填入數據轉為JSON檔案儲存**
```
// 設定主頁 & 表單,並將表單結果轉為JSON格式
app.get('/index.html', function (req, res) {
res.sendFile( __dirname + "/" + "index.html" );
});
app.get('/process_get', function (req, res) {
// 輸出 JSON 格式
var response = {
"first_name":req.query.first_name,
"last_name":req.query.last_name
};
console.log(response);
res.end(JSON.stringify(response));
});
```
執行結果
```
{ first_name: 'YO', last_name: '123' }
{ first_name: '456', last_name: '123' }
```
**Javascript 錯誤處理**
```
// 錯誤處理
// 我們預期在 try 區塊內的程式碼會成功執行
// 但當有 try 區塊中有任何錯誤發生時,會立即進入 catch 的區塊
// 如果沒有錯誤發生,則會跳過 catch 區塊
// finally 則是會在 try...catch... 之後先被執行
try {
var x = 10;
x = x + add;
console.log("Try區塊正確才能顯示出來")
} catch (exception) {
console.log(x);
console.log("Try區塊有錯誤喔")
} finally {
console.log(x);
console.log("在try catch區塊後執行")
};
```
執行結果
```
PS C:\Users\家維\Desktop\node0310> node error.js
10
Try區塊有錯誤喔
10
在try catch區塊後執行
```
**Javascript 函式用法**
```
let personal = {
name : 'Jacky',
age: 23,
birth: 860224,
// 將陣列資料轉為一個Function
toString: function(){
// this.XX 這個函式內的變數
return this.name + "年齡為" + this.age + "出生日為" + this.birth
}
};
// 輸出每個資料
console.log(personal.name);
console.log(personal.age);
console.log(personal.birth);
// 2秒後輸出
setTimeout(function() {
console.log(personal.toString());
},2000);
```
執行結果
```
Jacky
23
860224
Jacky年齡為23出生日為860224
```
# **成果筆記**
**FS文件系統**
* 打開文件 : fs.open()
* 寫入文件 : fs.writeFile()
* 擷取文件 ; fs.fturncate()
<br>
**動畫設定**
* requestAnimationFrame:要**自己 call 自己**,才會有下一次。不用設時間,會根據執行時間的快慢做調整。**是處理動畫首選**。函式內預設就會產生 time 這個變數。
* setTimeout: 一定要執行完後才能執行下一次,但仍會超過時間。可以用來處理資料。
* setInterval:一個還沒做完就會做下一次,而且會超過時間,最好少用。
**錯誤處理**
在撰寫程式的過程中發生錯誤(error)或出現例外情況(exception)是經常出現的情況,一般我們會把「錯誤」稱作「例外」,兩者可以交替著使用。
* try語句使你可以測試程式區塊是否存在錯誤。
* catch語句使你可以處理錯誤。
* throw語句使你可以建立自定義錯誤。
* finally語句使你可以在嘗試並捕獲之後執行代碼,而不管結果如何。
**this用法**
我們可以簡單理解為,**this所在函式被呼叫時的當前作用域**
Ex.
var fun = function()
{
console.log(this);
}
fun();// console: window,fun 的執行context為window,即this所在函式(fun())被呼叫時的當前作用域為window。
new fun();//console: fun,fun 的執行context為fun物件內,即this所在函式(fun())被呼叫時的當前作用域為fun物件內。
但有一種特殊情況
```
<input type=”button” id=”aButton” value=”demo” onclick=”demo()” />
<script type=”text/javascript”>
function demo() {
this.value = Math.random();
}
</script>
```
點選這個button之後,你會發現按鈕的value值沒有改變。
原因:在本程式碼執行的情況下**this指向的是window物件**。
# **心得**
這週的上課內容較多,理解的時間也較長。雖然可能沒辦法把fs及express的內容完全熟悉,但能操作的基本上都有實際操作過一次了,下次專案需要使用時,至少知道要使用哪一種方法了。另外,最近由於專案問題,發現自己在JS方面較為不足,決心利用這門課的學習時間,從最基礎開始認真理解JS之原理。目前也為了實習的履歷投遞建置自己的個人履歷網站,目前先以畫面為主,利用Bootstrap+Jquery做出簡單美觀的網站,並輔以些許互動元素。希望未來在認真學習js後,能夠再添加一些元素進入網站。