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')
})


在这里插入图片描述

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