Node.js
Node.js
express是一个基于Node.js 平台的极简、灵活的WEB应用开发框架,官方网址: https://www.expressjs.com.cn/
简单来说,express 是一个封装好的工具包, 封装了很多功能,便于我们开发WEB应用(HTTP 服务)
express本身也是npm包中的
安装express:
先初始化:npm init
再 npm i express
fs文件系统模块
1.读取指定文件中的内容
fs.readFile()的语法格式
使用fs.readFile()方法,可以读取指定文件中的内容,语法格式如下:
fs.readFile(path[, options], callback)
参数解读:
参数1 : 必选参数,字符串,表示文件的路径。
参数2 : 可选参数,表示以什么编码格式来读取文件。
参数3 : 必选参数,文件读取完成后,通过回调函数拿到读取的结果。
以utf8的编码格式,读取指定文件的内容,并打印err和dataStr 的值:
//导入fs模块,来操作文件
const fs = require('fs')
//异步读取
//调用fs.readFile()方法读取文件
//参数1:读取文件的存放路径
//参数2:读取文件时候采用的编码格式,一般默认指定utf8
//参数3:回调函数,拿到读取失败和成功的结果err dataStr
fs.readFile('./1.txt', 'utf8', function (err, dataStr) {
//失败打印err
//如果读取成功,则err的值为null
//如果读取失败,则err的值为错误对象,dataStr的值为undefined
console.log(err);
console.log('-------');
//成功打印dataStr
console.log(dataStr);
})
readFileSync同步读取
let data = fs.readFileSync('./1.txt')
console.log(data.toString());
createReadStream流式读取
const fs = require('fs')
//创建读取流对象
const rs = fs.createReadStream('./资料/918839605-1-208.mp4')
//绑定data事件
rs.on('data', chunk => {
console.log(chunk.length);
})
//end 可选事件
rs.on('end', () => {
console.log('读取完成');
})
文件复制(流式)
const fs = require('fs')
//流式
const rs = fs.createReadStream('./资料/妈妈生的.mp4')
const ws = fs.createWriteStream('./资料/妈妈生的2.mp4')
rs.on('data', chunk => {
ws.write(chunk)
})
2.向指定的文件中写入内容
fs.writeFile()的语法格式
使用fs.writeFile()方法,可以向指定的文件中写入内容,语法格式如下:
fs.writeFile(file, data[, options], callback)
参数解读:
参数1 : 必选参数,需要指定一个文件路径的字符串,表示文件的存放路径。
参数2 : 必选参数,表示要写入的内容。
参数3 : 可选参数,表示以什么格式写入文件内容,默认值是utf8。
参数4 : 必选参数,文件写入完成后的回调函数。
const fs = require('fs')
fs.writeFile('./1.txt', 'Hello Node.js', function (err) {
console.log(err);
})
//这里检测
fs.readFile('./1.txt', 'utf8', function (err, dataStr) {
if (err) {
return console.log('读取文件失败' + err.message);
}
console.log('读取文件成功' + dataStr);
})
3.文件追加内容
1、appendFile
fs.appendFile('./1.txt', ',你好', err => {
if (err) {
return console.log('读取文件失败' + err.message);
}
console.log('追加文件成功');
})
2、writeFile
fs.writeFile('./1.txt', ',love love love', { flag: 'a' }, err => {
if (err) {
return console.log('读取文件失败' + err.message);
}
console.log('追加文件成功');
})
4.流式写入
const fs = require('fs')
//创建写入流对象
const ws = fs.createWriteStream('./观书')
//write
ws.write('半亩方塘一鉴开\r\n');
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来');
//关闭通道
ws.close
5.文件重命名和移动
const fs = require('fs')
//重命名
fs.rename('./观书.txt', './观书有感.txt', err => {
if (err) {
return console.log('改写失败' + err.message);
}
console.log('改写成功');
})
//移动
fs.rename('./04成绩OK.txt', './资料/04成绩OK.txt', err => {
if (err) {
return console.log('移动失败' + err.message);
}
console.log('移动成功');
})
6.文件删除
const fs = require('fs')
//方法1 unlink
fs.unlink('./观书有感.txt', err => {
if (err) {
return console.log('删除失败' + err.message);
}
console.log('删除成功');
})
//方法2 rm
fs.rm('./资料/04成绩OK.txt', err => {
if (err) {
return console.log('删除失败' + err.message);
}
console.log('删除成功');
})
7.文件夹操作
const fs = require('fs')
//单个创建
fs.mkdir('./html', err => {
if (err) {
return console.log('创建失败;' + err.message);
}
console.log('创建成功');
})
//递归创建
fs.mkdir('./a/b/c', { recursive: true }, err => {
if (err) {
return console.log('创建失败;' + err.message);
}
console.log('创建成功');
})
//读取
fs.readdir('./资料', (err, data) => {
if (err) {
return console.log('读取文件失败' + err.message);
}
console.log('读取文件成功;' + data);
})
//删除
fs.rmdir('./html', err => {
if (err) {
return console.log('删除失败' + err.message);
}
console.log('删除成功');
})
//递归删除 不推荐
fs.rmdir('./a', { recursive: true }, err => {
if (err) {
return console.log('删除失败' + err.message);
}
console.log('删除成功');
})
//推荐
fs.rm('./a', { recursive: true }, err => {
if (err) {
return console.log('删除失败' + err.message);
}
console.log('删除成功');
})
8.查看资源信息
const fs = require('fs')
fs.stat('./资料/妈妈生的.mp4', function (err, data) {
if (err) {
return console.log('读取文件失败' + err.message);
}
//console.log(data);
//是否是文件
console.log(data.isFile());
//是否是文件夹
console.log(data.isDirectory());
})
express框架
路由的使用
//导入 express
const express = require('express')
const app = express()
//创建路由
//当浏览器发来请求,当方法是get且url路径是/home
//就会执行函数
app.get('/home', (req, res) => {
res.end('hello express')
})
// '/'表示网站的首页
app.get('/', (req, res) => {
res.end('holle //')
})
//post和get的访问方法不同,目前只能通过表单访问
app.post('/login', (req, res) => {
res.end('login')
})
//all能匹配所有访问方法
app.all('abc', (req, res) => {
res.end('all all')
})
// '*'能匹配所有url路径
//all 和 '*' 常用于做404
app.all('*', (req, res) => {
res.end('404 not Found')
})
app.listen(9000, () => {
console.log('启动!');
})
post的访问
<form action="http://127.0.0.1:9000/login" method="post">
<button>访问post</button>
</form>
获取请求参数
express包原生操作
//导入 express
const express = require('express')
const app = express()
//创建路由
app.get('/request', (req, res) => {
res.end('hello express')
//原生操作
// console.log(req.method);
// console.log(req.url);
// console.log(req.httpVersion);
// console.log(req.headers);
//express
console.log(req.path);
console.log(req.query);
//获取ip
console.log(req.ip);
//获取请求头
console.log(req.get('host'));
})
app.listen(9000, () => {
console.log('启动!');
})
获取路由参数
//导入 express
const express = require('express')
const app = express()
//创建路由
app.get('/:id.html', (req, res) => {
//获取url路由参数
console.log(req.params.id);
res.end('hello express')
})
app.listen(9000, () => {
console.log('启动!');
})
设置响应
//导入 express
const express = require('express')
const app = express()
//创建路由
app.get('/home', (req, res) => {
//express 响应
//res.status(500)
//res.set('aaa', 'bbb')
//.send()自带utf-8,使中文不会乱码
//res.send('你好')
//连写
//res.status(500).set('ccc', 'ddd').send('你好')
//其它
//跳转响应
//res.redirect('https://www.bilibili.com/')
//下载响应
//res.download('要下载文件的绝对路径')
//JSON 响应
// res.json({
// name: 'aaaa',
// slogon: '32222'
// })
//响应文件内容
res.sendFile(__dirname + '/表单访问post.html')
//res.end('hello express')
})
app.listen(9000, () => {
console.log('启动!');
})
express中间件
什么是中间件
中间件(Middleware)本质是一个回调函数
中间件函数可以像路由回调一样访问请求对象(request),响应对象(response)
中间件的作用
中间件的作用就是使用函数封装公共操作,简化代码
中间件的类型
全局中间件
路由中间件
定义全局中间件
每一个请求到达服务端之后都会执行全局中间件函数
//导入 express
const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
//声明中间件函数
function recordMiddleware(req, res, next) {
//公共函数封装
//获取url 和 ip
let { url, ip } = req
//将信息保存在文件中
fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`)
console.log(url);
//调用 next
next()
}
//使用中间件函数
app.use(recordMiddleware)
//创建路由
app.get('/home', (req, res) => {
res.send('前台首页')
})
app.get('/admin', (req, res) => {
res.send('后台首页')
})
app.all('*', (req, res) => {
res.send('404 Not Found')
})
app.listen(9000, () => {
console.log('启动!');
})
路由中间件
//导入 express
const express = require('express')
const fs = require('fs')
const path = require('path')
const app = express()
//创建路由
app.get('/home', (req, res) => {
res.send('前台首页')
})
//声明中间件
function checkCodeMiddleware(req, res, next) {
//判断url中是否code参数等于521
if (req.query.code === '521') {
next()
} else {
res.send('暗号错误')
}
}
app.get('/admin', checkCodeMiddleware, (req, res) => {
res.send('后台首页')
})
app.get('/setting', checkCodeMiddleware, (req, res) => {
res.send('设置页面')
})
app.all('*', (req, res) => {
res.send('404 Not Found')
})
app.listen(9000, () => {
console.log('启动!');
})
静态资源中间件
//导入 express
const express = require('express')
const app = express()
//静态资源中间件
app.use(express.static(__dirname + '/public'))
app.listen(9000, () => {
console.log('启动!');
})
获取请求体数据
//导入 express
const express = require('express')
const bodyParser = require('body-parser')
const app = express()
//解析JSON格式请求体的中间件
const jsonParser = bodyParser.json()
//解析querystring格式请求体的中间件
const urlencodedParser = bodyParser.urlencoded({ extended: false })
//创建路由
app.get('/home', (req, res) => {
res.sendFile(__dirname + '/public/09_获取请求体数据.html')
})
app.post('/home', urlencodedParser, (req, res) => {
//要实现获取表单发过来的值
//先在终端输入下载npm i body-parser包
res.send(`${req.body}`)
console.log(req.body);
//res.send('获取的内容')
})
app.listen(9000, () => {
console.log('启动!');
})
防盗链
//导入 express
const express = require('express')
const app = express()
app.use((req, res, next) => {
//检测请求头中的referer是否为127.0.0.1
//获取 referer
let referer = req.get('referer')
if (referer) {
//实例化
let url = new URL(referer)
//获取hostname
let hostname = url.hostname
if (hostname !== '127.0.0.1') {
res.status(404).send('404 Not Found')
return
}
}
next()
})
//静态资源中间件
app.use(express.static(__dirname + '/public'))
app.listen(9000, () => {
console.log('启动!');
})
路由模块化
//导入 express
const express = require('express')
const homeRouter = require('./routes/homeRouter')
const fs = require('fs')
const path = require('path')
const app = express()
//设置
app.use(homeRouter)
app.all('*', (req, res) => {
res.send('404 Not Found')
})
app.listen(9000, () => {
console.log('启动!');
})
被导入的模块
const express = require('express')
const fs = require('fs')
const path = require('path')
//创建路由对象
const router = express.Router()
function recordMiddleware(req, res, next) {
//公共函数封装
//获取url 和 ip
let { url, ip } = req
//将信息保存在文件中
fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url} ${ip}\r\n`)
console.log(url);
//调用 next
next()
}
//使用中间件函数
router.use(recordMiddleware)
//创建路由规则
router.get('/home', (req, res) => {
res.send('前台首页')
})
router.get('/admin', (req, res) => {
res.send('后台首页')
})
module.exports = router
EJS模板引擎
//安装EJS
//npm i ejs
//导入EJS
const ejs = require('ejs')
const fs = require('fs')
let china = '中国'
//let str = '我爱你<%= china %>'
let str = fs.readFileSync('./01html.html').toString()
//使用ejs渲染
let result = ejs.render(str, { china: china })
console.log(result);
01html.html :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1> 我爱你<%= china %></h1>
</body>
</html>
ejs的其它应用:
列表渲染(js)
const ejs = require('ejs')
const fs = require('fs')
const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧']
let html = fs.readFileSync('./02西游.html').toString()
let result = ejs.render(html, { xiyou: xiyou })
console.log(result);
(html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<% xiyou.forEach(item=>{ %>
<li>
<%= item %>
</li>
<% })%>
</ul>
</body>
</html>
条件渲染(js)
const ejs = require('ejs')
const fs = require('fs')
let isLogin = false
let html = fs.readFileSync('./03.html').toString()
let result = ejs.render(html, { isLogin: isLogin })
console.log(result);
(html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<p>
<% if(isLogin){ %>
111111
<% }else{ %>
22222222
<% } %>
</p>
</body>
</html>
express-generator 工具
1、安装:
npm install -g express-generator
2、添加模板引擎的支持
express -e 这里写文件夹的名称,创建或直接把代码下到这个文件夹
例:
express -e 15-generator
HTTP议模块
创建HTTP服务
//导入HTTP模块
const http = require('http')
//创建服务对象
const server = http.createServer((request, response) => {
//设置响应体
//response.end('Hello HTTP Server')
//获取请求的方法
//console.log(request.method);
//获取请求的url
//只包含url中的路径与查询字符串
//console.log(request.url);
//获取 HTTP 协义的版本号
//console.log(request.httpVersion);
//获取 HTTP 的请求头
console.log(request.headers);
response.setHeader('content-type', 'text/html;charset=utf-8')
response.end('你好')
})
//监听端口,启动服务
server.listen(9000, () => {
console.log('服务已经启动...');
//按ctrl+c终止服务
})
同一页面不同请求
//导入HTTP模块
const http = require('http')
//创建服务对象
const server = http.createServer((request, response) => {
let method = request.method
let { pathname } = new URL(request.url, 'http://127.0.0.1')
// console.log(method);
// console.log(pathname);
response.setHeader('content-type', 'text/html;charset=utf-8')
if (method === 'GET' && pathname === '/login') {
response.end('登录页面')
} else if (method === 'GET' && pathname === '/reg') {
response.end('注册页面')
} else {
response.end('都错了')
}
})
//监听端口,启动服务
server.listen(9000, () => {
console.log('服务已经启动... 端口 9000 监听中');
//按ctrl+c终止服务
})
将html、css、js显示
//导入HTTP模块
const http = require('http')
const fs = require('fs')
//创建服务对象
const server = http.createServer((request, response) => {
let { pathname } = new URL(request.url, 'http://127.0.0.1')
if (pathname === '/') {
let html = fs.readFileSync(__dirname + '/14-4真倒计时案例.html')
response.end(html)
} else if (pathname === '/08index.css') {
let css = fs.readFileSync(__dirname + '/08index.css')
response.end(css)
} else if (pathname === '/08index.js') {
let js = fs.readFileSync(__dirname + '/08index.js')
response.end(js)
} else {
response.statusCode = 404
response.end('<h1>404 Not Found</h1>')
}
// let html = fs.readFileSync(__dirname + '/14-4真倒计时案例.html')
// response.end(html)
// console.log(pathname);
})
//监听端口,启动服务
server.listen(9000, () => {
console.log('服务已经启动...');
//按ctrl+c终止服务
})
设置响应
//导入HTTP模块
const http = require('http')
//创建服务对象
const server = http.createServer((request, response) => {
//设置响应状态码
//response.statusCode = 404;
//响应状态的描述
//response.statusMessage = 'iloveyou'
//响应头
//response.setHeader('content-type', 'text/html;charset=utf-8')
//也可以自定义设响应头
//response.setHeader('abc', '666 777')
//设多个响应头
//response.setHeader('abc', ['1', '2', '4'])
//响应体
//write可以设多个,end只能设一个,没有end也不行
response.write('love')
response.write('Holle')
response.end('你好')
})
//监听端口,启动服务
server.listen(9000, () => {
console.log('服务已经启动...');
//按ctrl+c终止服务
})
- 0
- 0
- 0
- 0
- 0
- 0