Node.js 小白入門

Node.js 是什麼?


文件系統

  • 瀏覽器端的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')
})


在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章