常用快捷键
二、fs模块
回调函数为空,则表示写入成功!
练习
const fs = require('fs');
fs.readFile('../files/成绩.txt', 'utf-8', (err, dataStr) => {
if (err) {
console.log('读取失败');
return err;
}
console.log('读取成功');
const arr = dataStr.split(' ')
const newArr = arr.map(item => item.replace('=', ':'));
fs.writeFile('../files/02.txt', newArr.join('\r\n'), (err) => {
if (err) {
console.log('写入失败');
return;
}
console.log('写入成功');
})
})
fs模块,路径动态拼接,与执行的时候路径有关;
const fs = require('fs')
fs.readFile('D:\\ty\\code\\nodeJs\\nodeDemo01\\files\\02.txt', 'utf-8', (err,data) => {
console.log(1,err,data)
})
fs.readFile(__dirname+'../../files/02.txt', 'utf-8', (err,data) => {
console.log(2,err,data)
})
path模块
获取路径中的文件名
获取路径中的文件扩展名
案例
完整代码:
const fs = require('fs');
const path = require('path');
const regStyle = /<style>[\s\S]*<\/style>/;
const regScript = /<script>[\s\S]*<\/script>/;
fs.readFile(path.join(__dirname, '../files/ty.html'), 'utf-8', (err, data) => {
if (err) {
return;
}
console.log(data)
resolveCss(data)
resolveJs(data)
resolveHtml(data);
})
function resolveCss (htmlStr) {
const r1 = regStyle.exec(htmlStr);
// console.log(r1)
const newCss = r1[0].replace('<style>', '').replace('</style>', '');
// console.log(newCss)
fs.writeFile(path.join(__dirname, './clock/index.css'), newCss, err => {
console.log(err)
})
}
function resolveJs (htmlStr) {
const r1 = regScript.exec(htmlStr);
console.log(r1)
const newJs = r1[0].replace('<script>', '').replace('</script>', '');
console.log(newJs)
fs.writeFile(path.join(__dirname, './clock/index.js'), newJs, err => {
console.log(err)
})
}
function resolveHtml (htmlStr) {
const newHtml = htmlStr
.replace(regStyle, '<link rel="stylesheet",href="./css"></link>')
.replace(regScript, '<script src="./index.js"></script>');
fs.writeFile(path.join(__dirname, '/clock/index.html'), newHtml, err => {
console.log(err)
})
}
三http模块
const http = require('http');
const server = http.createServer();
server.on('request', function(req, res) {
console.log('请求了')
})
server.listen(8080, () => {
console.log('服务器已启动:http://127.0.0.1:8080')
})
根据不同的url相应不同的内容
四、模块化
npm与包
自定义npm包
发布包
模块的加载机制
五、Express
简介
安装
初步使用
const express = require('express');
const app = express();
app.get('/user', (req,res) => {
res.send({
name:'zs',age:20
})
})
app.post('/user', (req,res) => {
res.send('请求成功')
})
app.listen(80, () => {
console.log('express服务器启动')
})
{
"id": "22"
}
const express = require('express');
const app = express();
app.get('/user', (req,res) => {
res.send({
name:'zs',age:20
})
})
app.get('/', (req, res) => {
console.log(req.query);
res.send(req.query)
})
app.get('/user/:id/:name', (req, res) => {
// 动态匹配到的参数
console.log(req.params);
res.send(req.params)
})
app.post('/user', (req,res) => {
res.send('请求成功')
})
app.listen(80, () => {
console.log('express服务器启动')
})
静态资源托管
注意:前缀必须有“/”
nodemon的使用
路由
中间件
内置中间件
const express = require('express');
const { router } = require('./router')
const app = express();
// 定义一个中间件并注册为全局生效中间件
app.use((req, res, next)=> {
console.log('这是最简单的中间件函数');
const time = Date.now();
req.startTime = time;
next();
})
// 定义一个中间件并注册为全局生效中间件
app.use((req, res, next)=> {
console.log('这是第二个中间件函数');
next();
})
app.get('/', (req, res) => {
throw new Error('服务器错误')
res.send('/')
})
// 配置json格式中间件解析json格式数据
app.use(express.json());
app.use(router)
// 定义一个错误级别中间件
app.use((error,req, res, next)=> {
console.log('这是错误级别中间件函数');
res.send(error.message)
// next();
})
app.listen(80, () => {
console.log('服务器启动')
})
const express = require('express');
const router = express.Router();
// 定义局部中间件函数1
const mw1 = (req, res, next) => {
console.log('局部中间件1')
next()
}
// 定义局部中间件函数2
const mw2 = (req, res, next) => {
console.log('局部中间件2')
next()
}
router.get('/',mw1,mw2, (req, res) => {
console.log(req.startTime);
res.send('GET user list.')
})
router.get('/user/list',mw1,mw2, (req, res) => {
console.log(req.startTime);
throw new Error('服务器错误')
res.send('GET user list.')
})
router.post('/user/add', (req, res) => {
// 默认情况下,如果不配置解析表单数据的中间件,则req.body默认等于undefined
console.log(req.startTime,req.body);
res.send('Add new user.')
})
module.exports = {router}
express.urlencoded()
// 配置express.urlencoded()这个中间件解析表单中的url-encoded格式数据
app.use(express.urlencoded());
router.post('/book', (req, res) => {
// 在服务端,可以通过req.body 来获取JSON格式的表单数据和url-encoded格式数据
console.log(req.body)
res.send('ok')
})
安装
npm i body-parser
引入:
const parser = require('body-parser');
// 配置express.urlencoded()这个中间件解析表单中的url-encoded格式数据
// app.use(express.urlencoded());
// 第三方中间件
app.use(parser.urlencoded({extended:false}));
自定义中间件
const qs = require('querystring');
// 自定义一个中间件
app.use((req, res, next)=> {
console.log('这是自定义中间件函数-解析表单数据');
let str = '';
req.on('data', (chunk) => {
str += chunk;
})
req.on('end', () => {
console.log(11,str)
const body = qs.parse(str);
console.log(22,body)
})
next();
})
// custom-body-parser.js
const qs = require('querystring');
const bodyParser = (req, res, next) => {
console.log('这是自定义中间件函数-解析表单数据');
let str = '';
req.on('data', (chunk) => {
str += chunk;
})
req.on('end', () => {
console.log(11, str)
const body = qs.parse(str);
req.body = body;
console.log(22, body)
next();
})
};
module.exports = {bodyParser}
const { bodyParser } = require('./custom-body-parser');
// 自定义解析表单的中间件
app.use(bodyParser);
5种解析数据的方法
const parser = require('body-parser');
//1、 配置json格式中间件解析json格式数据
// app.use(express.json());
// 2、配置express.urlencoded()这个中间件解析表单中的url-encoded格式数据
// app.use(express.urlencoded());
//3、 第三方中间件
// app.use(parser.urlencoded({extended:false}));
// 4、自定义一个中间件
// app.use((req, res, next)=> {
// console.log('这是自定义中间件函数-解析表单数据');
// let str = '';
// req.on('data', (chunk) => {
// str += chunk;
// })
// req.on('end', () => {
// console.log(11,str)
// const body = qs.parse(str);
// req.body = body;
// console.log(22, body)
// next();
// })
// })
// 5、自定义解析表单的中间件
app.use(bodyParser);