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