Node.js
是什麼?
-
簡單的說
Node.js
就是運行在服務端的JavaScript
。
文件系統
- 瀏覽器端的
js
不能夠讀寫文件,服務端的當然可以 - 使用
require()
加載fs
模塊
文件寫入
- 調用
fs.writeFile()
將Hello World
寫入文件
var fs = require('fs')
var msg = 'Hello World'
fs.writeFile('./hello.txt', msg, 'utf-8', function(err) {
if (err) {
console.log('寫入文件出錯!具體錯誤:' + err)
} else {
console.log('ok!')
}
})
文件讀取
- 使用
path
模塊,動態拼接路徑 __dirname
:當前js
文件所在目錄__filename
:當前js
文件路徑fs.readFile()
如果不傳入編碼方式,則讀取到的數據類型是Buffer(字節數組)
var fs = require('fs')
var path = require('path')
fs.readFile('./hello.txt', function(err, data) {
if (err) {
console.log(err)
}
// console.log(data) // <Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
console.log(data.toString('utf-8'))
})
// console.log(__dirname)
// console.log(__filename)
var fileName = path.join(__dirname, 'hello.txt')
console.log(fileName)
fs.readFile(fileName, 'utf-8', function(err, data) {
if (err) {
console.log(err)
}
console.log(data)
})
創建目錄
- 調用
fs.mkdir()
創建目錄
var fs = require('fs')
fs.mkdir('./aaa/bbb', function(err) {
if (err) {
console.log(err)
} else {
console.log('ok!')
}
})
Web 模塊
- 創建一個簡易
http
服務器 - 使用
require()
加載http
模塊 - 監聽本機 8080 端口,接收所有請求,響應
hello world!
- 每一次響應之後,都需要結束響應
var http = require('http')
var server = http.createServer();
server.on('request',function(req,res){
res.write('hello world!')
res.end()
})
server.listen(8080,function(){
console.log('服務啓動了,請訪問:http://localhost:8080')
})
設置響應頭
- 解決中文亂碼的問題
var http = require('http')
var server = http.createServer();
server.on('request',function(req,res){
res.setHeader('Content-Type','text/html;charset=utf-8')
res.write('hello world!')
res.write('你好,世界!')
res.write('<h1>hello world!</h1>')
res.end()
})
server.listen(8080,function(){
console.log('服務啓動了,請訪問:http://localhost:8080')
})
根據請求路徑,響應內容
res.url
獲取請求的url
- 可以調用
res.end()
,直接響應數據
var http = require('http')
var server = http.createServer();
server.on('request',function(req,res){
if(req.url === '/index'){
res.end('hello world!')
} else{
res.end('hello!')
}
})
server.listen(8080,function(){
console.log('服務啓動了,請訪問:http://localhost:8080')
})
響應 html 頁面
- 根據請求路徑,響應對應的
html
頁面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>首頁</title>
<link rel="stylesheet" type="text/css" href="./css/style.css"/>
</head>
<body>
<h1>首頁!</h1>
<img src="./img/109951164915820004.jpg" >
</body>
</html>
var http = require('http')
var fs = require('fs')
var path = require('path')
var server = http.createServer();
server.on('request',function(req,res){
if(req.url === '/index'){
var fileName = path.join(__dirname,'index.html')
fs.readFile(fileName,function(err,data){
if(err){
console.log('讀取文件出錯啦!')
}
res.end(data)
})
} else{
res.end('hello!')
}
})
server.listen(8080,function(){
console.log('服務啓動了,請訪問:http://localhost:8080')
})
處理圖片響應
- 注意到一個問題,
html
頁面中的圖片和css
文件並沒有加載成功 - 原因在與我們並沒有對該請求進行處理
- 需要判斷請求
url
,響應圖片和樣式文件
var http = require('http')
var fs = require('fs')
var path = require('path')
var server = http.createServer();
server.on('request', function(req, res) {
if (req.url === '/index') {
var fileName = path.join(__dirname, 'index.html')
fs.readFile(fileName, function(err, data) {
if (err) {
console.log('讀取文件出錯啦!')
}
res.end(data)
})
} else if (req.url === '/109951164915820004.jpg') {
var fileName = path.join(__dirname, '109951164915820004.jpg')
fs.readFile(fileName, function(err, data) {
res.setHeader('Content-Type', 'image/jpg')
if (err) {
console.log('讀取圖片出錯啦!')
}
res.end(data)
})
} else if (req.url === '/style.css') {
var fileName = path.join(__dirname, 'style.css')
fs.readFile(fileName, function(err, data) {
res.setHeader('Content-Type', 'text/css')
if (err) {
console.log('讀取css出錯啦!')
}
res.end(data)
})
} else {
res.end('hello!')
}
})
server.listen(8080, function() {
console.log('服務啓動了,請訪問:http://localhost:8080')
})
整合響應處理
- 對每一個
url
進行判斷處理,工作量實在是太大,可以將多個請求整合 - 使用到第三方模塊
mime
,在項目根目錄下執行npm install mime
進行安裝 mime
的作用:根據url
後綴,返回對應的Content-Type
var http = require('http')
var fs = require('fs')
var path = require('path')
var mime = require('mime')
var server = http.createServer();
server.on('request', function(req, res) {
var filename = path.join(__dirname, 'static', req.url)
// console.log(req.url)
// console.log(filename)
fs.readFile(filename, function(err, data) {
if (err) {
console.log('讀取文件出錯啦!文件路徑:' + filename)
} else {
res.setHeader('Content-Type', mime.getType(filename))
res.end(data)
}
})
})
server.listen(8080, function() {
console.log('服務啓動了,請訪問:http://localhost:8080')
})
處理 get 請求
- 獲取表單數據
- 將讀取到的表單數據,轉換爲
json
格式 - 保存到
json
文件 - 設置響應頭,使瀏覽器跳轉頁面
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>首頁</title>
</head>
<body>
<h1>首頁!</h1>
<form action="/login" method="get">
<input type="text" name="username" id="" value="" />
<input type="password" name="password" id="" value="" />
<input type="submit" name="" id="" value="登錄" />
</form>
</body>
</html>
var http = require('http')
var fs = require('fs')
var path = require('path')
var mime = require('mime')
var server = http.createServer();
var url = require('url')
server.on('request', function(req, res) {
req.url = req.url.toLowerCase()
req.method = req.method.toLowerCase()
if (req.url.startsWith('/login') && req.method === 'get') {
var logingUrl = url.parse(req.url, true)
var list = []
list.push(logingUrl.query)
var filename = path.join(__dirname, 'static', 'data', 'login.json')
fs.writeFile(filename, JSON.stringify(list), function(err) {
if (err) {
console.log('寫入文件出錯!具體錯誤:' + err)
} else {
console.log('ok!')
res.statusCode = 302
res.statusMessage = 'Found'
res.setHeader('Location', '/')
res.end()
}
})
} else if (req.url = '/' && req.method === 'get') {
var filename = path.join(__dirname, 'static', 'index.html')
fs.readFile(filename, function(err, data) {
if (err) {
console.log('讀取文件出錯啦!文件路徑:' + filename)
} else {
res.setHeader('Content-Type', mime.getType(filename))
res.end(data)
}
})
}
})
server.listen(8080, function() {
console.log('服務啓動了,請訪問:http://localhost:8080')
})
處理 post 請求
- 監聽
data
事件,收集每一次傳輸的數據 - 監聽
end
事件,待數據傳輸結束後,通過querystring.parse()
,解析數據 - 轉換爲
json
格式,保存到json
文件
var http = require('http')
var fs = require('fs')
var path = require('path')
var mime = require('mime')
var url = require('url')
var querystring = require('querystring')
var server = http.createServer();
server.on('request', function(req, res) {
req.url = req.url.toLowerCase()
req.method = req.method.toLowerCase()
if (req.url.startsWith('/login') && req.method === 'post') {
var list = []
var array = []
req.on('data', function(chunk) {
array.push(chunk)
})
req.on('end', function() {
var postBody = Buffer.concat(array)
postBody = postBody.toString('utf8')
// console.log(postBody) // username=sadm&password=asas
postBody = querystring.parse(postBody)
// console.log(postBody) // { username: 'sadm', password: 'asas' }
list.push(postBody)
var filename = path.join(__dirname, 'static', 'data', 'login.json')
fs.writeFile(filename, JSON.stringify(list), function(err) {
if (err) {
console.log('寫入文件出錯!具體錯誤:' + err)
} else {
console.log('ok!')
res.statusCode = 302
res.statusMessage = 'Found'
res.setHeader('Location', '/')
res.end()
}
})
})
} else if (req.url = '/' && req.method === 'get') {
var filename = path.join(__dirname, 'static', 'index.html')
fs.readFile(filename, function(err, data) {
if (err) {
console.log('讀取文件出錯啦!文件路徑:' + filename)
} else {
res.setHeader('Content-Type', mime.getType(filename))
res.end(data)
}
})
}
})
server.listen(8080, function() {
console.log('服務啓動了,請訪問:http://localhost:8080')
})