目录
读取文件内容
判断文件是否读取成功
写入文件内容
判断文件是否写入成功
整理成绩案例
const fs = require('fs')
fs.readFile('./1.txt','utf8',function(err,dataStr){
if (err) {
console.log('文件读取失败!'+err.message);
}
const arrStr = dataStr.split(' ')
console.log(arrStr);
const arrNew = [];
arrStr.forEach(item=>{
arrNew.push(item.replace('=',': '))
})
console.log(arrNew);
var newStr = arrNew.join('\r\n')
console.log(newStr);
fs.writeFile('./3cl.txt',newStr,function(err){
if (err) {
console.log('文件写入失败!'+err.message);
}
console.log('成绩写入成功');
})
})
处理路径问题
使用pash模块处理路径
获取路径文件名
获取路径中的文件扩展名
分别处理CSS,JS,HTML
//1.1定义fs模块
const fs = require('fs')
const { join, resolve } = require('path')
//1.2定义path模块
const path = require('path')
//1.3定义正则表达式分别匹配<style></style>和<script></script>标签
const regStyle = /<style>[\s\S]*<\/style>/
const regScript = /<script>[\s\S]*<\/script>/
//2.1读取需要被处理的HTML文件
fs.readFile(path.join(__dirname+'/christmasTrees.html'),'utf8',function(err,dataStr){
//2.2读取文件失败
if (err) {
console.log('读取文件失败!'+err.message);
}
//2.3读取HTML文件成功后,调用对应的方法,拆解出css、js 和 html 文件
resolveCSS(dataStr)
resolveJS(dataStr)
resolveHTML(dataStr)
/* resolveHTML(dataStr) */
})
//3.1定义处理css样式的方法
function resolveCSS(htmlStr) {
//3.2使用正则提取需要的内容
const r1 = regStyle.exec(htmlStr)
console.log(r1);
//3.3将提取出来的样式字符串,进行字符串的replace替换操作
const newCSS = r1[0].replace('<style>','').replace('</style>','')
console.log(newCSS);
//3.4调用方法将提取的样式,写入到 clock目录中index.css的文件里面
fs.writeFile(path.join(__dirname+'/clock/index.css'),newCSS,function(err){
if (err) return console.log('写入CSS样式失败!'+err.message);
console.log('写入样式文件成功');
})
}
//4.1处理js脚本
function resolveJS(htmlStr) {
//4.2使用正则提取需要的内容
const r2 = regScript.exec(htmlStr)
console.log(r2);
//4.3将提取出来的脚本字符串,进行字符串的replace替换操作
const newJS = r2[0].replace('<script>','').replace('</script>','')
console.log(newJS);
//4.4调用方法将提取的js脚本,写入到 clock目录中index.js的文件里面
fs.writeFile(path.join(__dirname+'/clock/index.js'),newJS,function(err){
if (err) return console.log('写入JavaScript失败!'+err.message);
console.log('写入JS脚本成功');
})
}
//5.1定义处理HTML结构的方法
function resolveHTML(htmlStr){
//5.2将字符串调用replace方法,把内嵌的style和script标签,替换为外联的link和script标签
const newHTML = htmlStr.replace(regStyle,'<link rel="stylesheet" href="../clock/index.css">').replace(regScript,'<script src="../clock/index.js"></script>')
//5.3写入HTML文件
fs.writeFile(path.join(__dirname+'/clock/index.html'),newHTML,function(err){
if (err) return console.log('写入html页面失败!'+err.message);
console.log("写入html页面成功");
})
}
创建最基本的web服务器
//1.导入http模块
const http = require('http')
//2.创建web服务器示例
const server = http.createServer()
//3.为服务器示例绑定request事件 监听客户端请求
server.on('request',(req,res)=>{
console.log('Someone visit our web server');
})
//4.启动服务器
server.listen(8080,()=>{
console.log('http server running at http://127.0.0.1:8080');
})
req的请求数据
//1.导入http模块
const http = require('http')
//2.创建web服务器示例
const server = http.createServer()
//3.为服务器示例绑定request事件 监听客户端请求
//req是请求对象 包含了与客户的相关的数据和属性
server.on('request', (req) => {
//req.url是客户端请求的url地址
const url = req.url
//req.method是客户端请求的method类型
const method = req.method
const str = `Your request url is ${url},and request method is ${method}`
console.log(str);
})
//4.启动服务器
server.listen(80, () => {
console.log('http server running at http://127.0.0.1');
})
res响应对象
解决中文乱码问题
//1.导入http模块
const http = require('http')
//2.创建web服务器示例
const server = http.createServer()
//3.为服务器示例绑定request事件 监听客户端请求
//req是请求对象 包含了与客户的相关的数据和属性
server.on('request', (req,res) => {
//req.url是客户端请求的url地址
const url = req.url
//req.method是客户端请求的method类型
const method = req.method
const str = `你请求的url地址是 ${url},请求的method类型为 ${method}`
console.log(str);
//调用res.setHeader()方法来解决中午乱码问题
res.setHeader('Content-Type','text/html;charset=utf-8')
//调用res.end()方法,向客户端相应一些内容
res.end(str)
})
//4.启动服务器
server.listen(80, () => {
console.log('http server running at http://127.0.0.1');
})
根据不同的url响应不同的html内容
//1.导入http模块
const http = require('http')
//2.创建web服务器示例
const server = http.createServer()
//3.为服务器示例绑定request事件 监听客户端请求
//req是请求对象 包含了与客户的相关的数据和属性
server.on('request', (req,res) => {
//1.获取请求的url地址
const url = req.url
//2.设置默认的响应内容为404 Not found
let content = '<h1>404 Not found!</h1>'
//3.判断用户请求的是否为/或/index.html首页
//4.判断用户请求的是否为/about.html 关于页面
if (url==='/'||url==='/index.html') {
content = '<h1>首页</h1>'
}else if (url==='/about.html') {
content = '<h1>关于页面</h1>'
}
//5.设置 Content-Type响应头,防止中文乱码
res.setHeader('Content-Type','text/html;charset=utf-8')
//6.使用res.end()把内容响应给客户端
res.end(content)
})
//4.启动服务器
server.listen(80, () => {
console.log('http server running at http://127.0.0.1');
})
使用Express创建一个服务器
//1.导入express
const express = require('express')
//2.创建web服务器
const app = express()
//3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1');
})
使用Express发起GET请求和POST请求
//1.导入express
const express = require('express')
//2.创建web服务器
const app = express()
//4.监听客户端的GET和 POST请求,并向客户端响应具体的内容
app.get('/user',(req,res)=>{
//调用express提供的res.send()方法,向客户端响应一个 JSON 对象
res.send({name:'zs',age:30,gender:'男'})
})
app.post('/user',(req,res)=>{
//调用express提供的res.send()方法,向客户端响应一个 文本字符串
res.send('请求成功')
})
//3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1');
})
获取URL中携带的查询参数
//1.导入express
const express = require('express')
//2.创建web服务器
const app = express()
//3.调用app.listen(端口号,启动成功后的回调函数),启动服务器
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1');
})
app.get('/',(req,res)=>{
//通过 req. query可以获取到客户端发送过来的查询参数
//注意:默认情况下,req.query是一个空对象
console.log(req.query)
res.send(req.query)
})
获取URL中的动态参数
app.get('/user/:id',(req,res)=>{
//req.params对象是动态匹配到的URL参数 默认是一个空对象
console.log(req.params)
res.send(req.params)
})
托管静态资源
express提供了一个非常好用的函数,叫做express.static),通过它我们可以非常方便地创建一个静态资源服务器,例如,通过如下代码就可以将public目录下的图片、CSS文件、JavaScript 文件对外开放访问了:
const express = require('express')
const app = express()
app.use(express.static('../clock'))
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1');
})
挂载路径前缀
const express = require('express')
const app = express()
app.use('/public',express.static('../clock'))
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1');
})
可以通过带有/public 前缀地址来访问public目录中的文件了:
http://127.0.0.1/publick/index.html
http://127.0.0.1/publick/index.css
http://127.0.0.1/publick/index.js
路由最简单的用法
const express = require('express')
const app = express()
app.get('/',(req,res)=>{
res.send('hello world')
})
app.post('/',(req,res)=>{
res.send('POST REQUEST')
})
app.listen(80,()=>{
console.log('express server running at http://127.0.0.1');
})
路由的模块化
const express = require('express')
const app = express()
//导入路由模块
const router = require('./test')
//注册路由模块
app.use(router)
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
//1.导入express
const express = require('express')
const app = express()
//2.创建路由对象
const router = express.Router()
//3.挂载获取用户列表的路由
router.get('/user/list',(req,res)=>{
res.send('Get user list')
})
//4.挂载添加用户的路由
router.post('/user/add',(req,res)=>{
res.send('Add new user')
})
//5.向外导出路由对
module.exports = router
为路由模块添加前缀
const express = require('express')
const app = express()
//导入路由模块
const router = require('./test')
//注册路由模块
app.use('/api',router)
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
定义一个全局生效的中间件
const express = require('express')
const app = express()
//定义一个中间件函数
const mw = function (req,res,next) {
console.log('这是一个中间件函数');
//把流转关系转交给下一个中间件或路由
next()
}
//将mw注册为全局生效的中间件
app.use(mw)
app.get('/',(req,res)=>{
res.send('Home page')
})
app.get('/user',(req,res)=>{
res.send('User page')
})
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
简化版中间件
const express = require('express')
const app = express()
//定义一个简化中间件函数
app.use((req,res,next)=>{
console.log('这是一个中间件函数');
next()
})
app.get('/',(req,res)=>{
res.send('Home page')
})
app.get('/user',(req,res)=>{
res.send('User page')
})
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
中间件的作用
const express = require('express')
const app = express()
//定义一个简化中间件函数
app.use((req,res,next)=>{
//获取到请求到达服务器的时间
const time = Date.now()
//为req对象,挂载自定义属性,从而把时间共享给后面的所有路由
req.startTime = time
next()
})
app.get('/',(req,res)=>{
res.send('Home page'+req.startTime)
})
app.get('/user',(req,res)=>{
res.send('User page'+req.startTime)
})
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
定义多个全局生效的中间件
const express = require('express')
const app = express()
//定义第一个全局中间件
app.use((req,res,next)=>{
console.log('调用了第一个全局中间件');
next()
})
//定义第二个全局中间件
app.use((req,res,next)=>{
console.log('调用了第一个全局中间件');
next()
})
//定义一个路由
app.get('/user',(req,res)=>{
res.send('User page')
})
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
局部生效的中间件
//导入express
const express = require('express')
//创建express的服务器实例
const app = express()
//定义中间件函数
const mw1 = (req,res,next)=>{
console.log('调用了局部生效的中间件');
next()
}
//创建路由
app.get('/',mw1,(req,res)=>{
res.send('Home page')
})
app.get('/user',(req,res)=>{
res.send('User page')
})
//启动服务器
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
同时使用多个局部生效的中间件
//导入express
const express = require('express')
//创建express的服务器实例
const app = express()
//定义中间件函数
const mw1 = (req,res,next)=>{
console.log('调用了第一个局部生效的中间件');
next()
}
//定义第二个中间件函数
const mw2 = (req,res,next)=>{
console.log('调用了第二个局部生效的中间件');
next()
}
//创建理由
app.get('/',mw1,mw2,(req,res)=>{
res.send('Home page')
})
app.get('/user',(req,res)=>{
res.send('User page')
})
//启动服务器
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
编写GET接口
const express = require('express')
const app = express()
const router = require('./ly')
app.use('/api',router)
app.listen(80, () => {
console.log(`Express server running at http://127.0.0.1`)
})
const express = require('express')
const router = express.Router()
router.get('/get',(req,res)=>{
const query = req.query
res.send({
status:0,
msg:'GET请求成功!',
data:query
})
})
module.exports = router
编写POST接口
const express = require('express')
const router = express.Router()
router.post('/post',(req,res)=>{
const body = req.body
res.send({
status:0,
msg:'POST请求响应成功!',
data:body
})
})
module.exports = router