1.fs
// fs 是 file-system 的簡寫踏施,就是文件系統(tǒng)的意思
// 例如:fs.readFile 就是用來讀取文件的
// 1. 使用 require 方法加載 fs 核心模塊
var fs = require('fs')
// 2. 讀取文件
// 第一個參數(shù)就是要讀取的文件路徑
// 第二個參數(shù)是一個回調(diào)函數(shù)
// 成功
// data 數(shù)據(jù)
// error null
// 失敗
// data undefined沒有數(shù)據(jù)
// error 錯誤對象
fs.readFile('./data/a.txt', function (error, data) {
// <Buffer 68 65 6c 6c 6f 20 6e 6f 64 65 6a 73 0d 0a>
// 文件中存儲的其實(shí)都是二進(jìn)制數(shù)據(jù) 0 1
// 這里為什么看到的不是 0 和 1 呢衅澈?原因是二進(jìn)制轉(zhuǎn)為 16 進(jìn)制了
// 所以我們可以通過 toString 方法把其轉(zhuǎn)為我們能認(rèn)識的字符
// console.log(data)
// console.log(error)
// console.log(data)
// 在這里就可以通過判斷 error 來確認(rèn)是否有錯誤發(fā)生
if (error) {
console.log('讀取文件失敗了')
} else {
console.log(data.toString())
}
})
fs.writeFile('./data/你好.md', '大家好,給大家介紹一下屋摔,我是Node.js', function (error) {
// console.log('文件寫入成功')
// console.log(error)
if (error) {
console.log('寫入失敗')
} else {
console.log('寫入成功了')
}
})
2.Http
// 1. 加載 http 核心模塊
var http = require('http')
// 2. 使用 http.createServer() 方法創(chuàng)建一個 Web 服務(wù)器
// 返回一個 Server 實(shí)例
var server = http.createServer()
// 3. 服務(wù)器響應(yīng)請求
server.on('request', function () {
console.log('收到客戶端的請求了')
})
// 4. 綁定端口號迫悠,啟動服務(wù)器
server.listen(3000, function () {
console.log('服務(wù)器啟動成功了,可以通過 http://127.0.0.1:3000/ 來進(jìn)行訪問')
})
3.os&path
// 用來獲取機(jī)器信息的
var os = require('os')
// 用來操作路徑的
var path = require('path')
// 獲取當(dāng)前機(jī)器的 CPU 信息
console.log(os.cpus())
// memory 內(nèi)存
console.log(os.totalmem())
// 獲取一個路徑中的擴(kuò)展名部分
// extname extension name
console.log(path.extname('c:/a/b/c/d/hello.txt'))
4.ip 地址用來定位計算機(jī)
端口號用來定位具體的應(yīng)用程序
所有需要聯(lián)網(wǎng)通信的應(yīng)用程序都會占用一個端口號
5. 在 http 協(xié)議中,Content-Type 就是用來告知對方我給你發(fā)送的數(shù)據(jù)內(nèi)容是什么類型
res.setHeader('Content-Type', 'text/plain; charset=utf-8')
res.end('hello 世界')
6.代碼寫不寫封號
// ` 是 EcmaScript 6 中新增的一種字符串包裹方式全蝶,叫做:模板字符串
// 它支持換行和非常方便拼接變量
// var foo = `
// 大家好
// hello 床前明月光
// world
// 哈哈哈`
// console.log(foo)
;`hello`.toString()
// 當(dāng)你采用了無分號的代碼風(fēng)格的時候,只需要注意以下情況就不會有上面的問題了:
// 當(dāng)一行代碼是以:
// (
// [
// `
// 開頭的時候寺枉,則在前面補(bǔ)上一個分號用以避免一些語法解析錯誤抑淫。
// 所以你會發(fā)現(xiàn)在一些第三方的代碼中能看到一上來就以一個 ; 開頭。
// 結(jié)論:
// 無論你的代碼是否有分號姥闪,都建議如果一行代碼是以 (始苇、[、` 開頭的筐喳,則最好都在其前面補(bǔ)上一個分號催式。
// 有些人也喜歡玩兒一些花哨的東西函喉,例如可以使用 ! ~ 等。
7.art-template
var template = require('art-template')
var fs = require('fs')
fs.readFile('./tpl.html', function (err, data) {
if (err) {
return console.log('讀取文件失敗了')
}
// 默認(rèn)讀取到的 data 是二進(jìn)制數(shù)據(jù)
// 而模板引擎的 render 方法需要接收的是字符串
// 所以我們在這里需要把 data 二進(jìn)制數(shù)據(jù)轉(zhuǎn)為 字符串 才可以給模板引擎使用
//template.render(data.toString(), { }) 第一個參數(shù)是要替換的內(nèi)容荣月,第二個是替換內(nèi)容
var ret = template.render(data.toString(), {
name: 'Jack',
age: 18,
province: '北京市',
hobbies: [
'寫代碼',
'唱歌',
'打游戲'
],
title: '個人信息'
})
#html
<body>
<p>大家好管呵,我叫:{{ name }}</p>
<p>我今年 {{ age }} 歲了</p>
<h1>我來自 {{ province }}</h1>
<p>我喜歡:{{each hobbies}} {{ $value }} {{/each}}</p>
</body>
8.在瀏覽器中使用art-template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>06-在瀏覽器中使用art-template</title>
</head>
<body>
<!--
注意:在瀏覽器中需要引用 lib/template-web.js 文件
強(qiáng)調(diào):模板引擎不關(guān)心你的字符串內(nèi)容,只關(guān)心自己能認(rèn)識的模板標(biāo)記語法哺窄,例如 {{}}
{{}} 語法被稱之為 mustache 語法捐下,八字胡啊。
-->
<script src="node_modules/art-template/lib/template-web.js"></script>
<script type="text/template" id="tpl">
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p>大家好萌业,我叫:{{ name }}</p>
<p>我今年 {{ age }} 歲了</p>
<h1>我來自 {{ province }}</h1>
<p>我喜歡:{{each hobbies}} {{ $value }} {{/each}}</p>
</body>
</html>
</script>
<script>
var ret = template('tpl', {
name: 'Jack',
age: 18,
province: '北京市',
hobbies: [
'寫代碼',
'唱歌',
'打游戲'
]
})
console.log(ret)
</script>
</body>
</html>
9.##url解析
http
.createServer(function (req, res) { // 簡寫方式坷襟,該函數(shù)會直接被注冊為 server 的 request 請求事件處理函數(shù)
// 使用 url.parse 方法將路徑解析為一個方便操作的對象,第二個參數(shù)為 true 表示直接將查詢字符串轉(zhuǎn)為一個對象(通過 query 屬性來訪問)
var parseObj = url.parse(req.url, true)
// 單獨(dú)獲取不包含查詢字符串的路徑部分(該路徑不包含 ? 之后的內(nèi)容)
var pathname = parseObj.pathname
if (pathname === '/') {
fs.readFile('./views/index.html', function (err, data) {
if (err) {
return res.end('404 Not Found.')
}
var htmlStr = template.render(data.toString(), {
comments: comments
})
res.end(htmlStr)
})
}
10##重定向
// 如何通過服務(wù)器讓客戶端重定向生年?
// 1. 狀態(tài)碼設(shè)置為 302 臨時重定向
// statusCode
// 2. 在響應(yīng)頭中通過 Location 告訴客戶端往哪兒重定向
// setHeader
// 如果客戶端發(fā)現(xiàn)收到服務(wù)器的響應(yīng)的狀態(tài)碼是 302 就會自動去響應(yīng)頭中找 Location 婴程,然后對該地址發(fā)起新的請求
// 所以你就能看到客戶端自動跳轉(zhuǎn)了
res.statusCode = 302
res.setHeader('Location', '/')
res.end()