目录
1、fs文件系统模块
1.1读取指定文件内容
eg:
// 1导入模块
const fs=require('fs');
// 2调用fs.require()方法读取文件
fs.readFile('./files/测试.txt',"utf-8",function(err,dataStr) {
// 打印失败结果
// 如果读取成功 err为null
// 读取失败 err为错误对象,dataStr值为undefined
console.log(err);
console.log("------");
// 成功结果
console.log(dataStr);
})
判断文件读取成功:
const fs=require('fs');
fs.readFile('./files/测试.txt','utf-8',function(err,dataStr) {
if(err) {
return console.log("读取文件失败",+err.message);
}
console.log("读取文件成功"+dataStr);
})
1.2向指定文件写入内容
eg:
// 导入fs文件系统模块
const fs=require('fs');
// 调用fs.writeFile()方法写入v内容
fs.writeFile("./files/测试.txt","abcd",function(err) {
// 写入成功 err返回null
// 写入失败 err返回一个错误对象
console.log(err);
})
判断文件写入成功:
// 导入fs文件系统模块
const fs=require('fs');
// 调用fs.writeFile()方法写入v内容
fs.writeFile("./files/测试sss.txt","abcd1223",function(err) {
// 写入成功 err返回null
// 写入失败 err返回一个错误对象
if(err) {
return console.log("写入文件失败",err.message);
}
console.log("文件写入成功");
})
2、path路径模块
eg:
const path=require('path');
// ../抵消前面的路径
const pathStr=path.join('/a','/b/c','../','./d','e');
console.log(pathStr);
const fs=require("fs");
fs.readFile(path.join(__dirname,'../files/1.txt'),'utf8',function(arr,dataStr) {
if(arr) {
return console.log(arr.message);
}
console.log(dataStr);
})
2.1获取路径中文件名
eg:
const path=require('path');
// 定义文件存放路径
const fpath='a/b/c/d/index.html';
// const flname=path.basename(fpath);
// console.log(flname);//index.html
const namew=path.basename(fpath,'.html');//输出的最后一个删除.html
console.log(namew);//index
2.2获取路径扩展名部分
eg:
const path=require('path');
const fpath='a/b/c/index.html';
const fext=path.extname(fpath);
console.log(fext);
3、http模块
3.1创建web服务器
// 1.导入http模块
const http=require('http');
// 2.创建web服务器实例
const server=http.createServer();
// 3.为服务器绑定request事件,监听客服端的请求
server.on("request",function(req,res) {
console.log("请求成功");
})
// 4.启动服务器
server.listen(8080,function() {
console.log("server running at http://127.0.0.1:8080");
})
req请求对象
const http=require('http');
const server=http.createServer();
server.on('request',(req)=>{
const url=req.url;
const method=req.method;
const str=`your request url is ${url},and request method is ${method}`;
console.log(str);
});
server.listen(801,function() {
console.log("请求成功,http://127.0.0.1:801");
})
res响应对象
const http=require('http');
const server=http.createServer();
server.on('request',(req,res)=>{
const url=req.url;
const method=req.method;
const str=`your request url is ${url},and request method is ${method}`;
console.log(str);
// 调用res.end()方法 向客服端响应内容
res.end(s);
});
server.listen(801,function() {
console.log("请求成功,http://127.0.0.1:801");
})
防止乱码
const http=require('http');
const server=http.createServer();
server.on('request',(req,res)=>{
const url=req.url;
const method=req.method;
const str=`你请求的url地址是${url},你请求的方式是 ${method}`;
console.log(str);
// 防止乱码
res.setHeader('Content-Type','text/html;charset=utf-8');
// 调用res.end()方法 向客服端响应内容
res.end(str);
});
server.listen(801,function() {
console.log("请求成功,http://127.0.0.1:801");
})
3.2根据不同的url响应不同的html内容
核心步骤:
const http=require('http');
const server=http.createServer();
server.on("request",(req,res)=>{
//1、 获取请求url地址
const url=req.url;
//2、 设置默认响应内容
let conts='<h1>404 Not found!</h1>';
// 3、判断用户请求是否为/或者/index.html首页
// 4、判断用户请求的是否为/about.html关于首页
if(url==='/' || url==='/index.html') {
conts='<h1>首页</h1>';
} else if (url==='/about.html') {
conts='<h1>关于页面</h1>'
}
// 5、设置防止乱码
res.setHeader('Content-Type','text/html;charset=utf-8');
// 6、使用res.end()把内容响应给客户端
res.end(conts);
});
server.listen(8080,function() {
console.log("server running at http://127.0.0.1:8080");
})
4、模块化
4.1概念
4.2加载模块
4.3模块作用域
4.3.1module对象
5、npm与包
5.1创建package.json包
npm init -y
安装所有包:npm i
卸载包:npm uninstall 包名
dev节点
包的分类:
6、express
创建web服务器
// 1、导入express
const express=require('express');
//2、创建服务器
const app=express();
// 4、监听客户端的get和post请求,并向客户响应具体内容
app.get('/user',(req,res)=>{
// 调用express提供的res.send()方法,向客户端响应一个json对象
res.send({name:'zs',age:20,gender:'男'});
})
app.post('/user',(req,res)=>{
// 调用express提供的res.send()方法,向客户端响应一个文本字符串
res.send("请求成功");
})
app.get('/',(req,res)=>{
//req.query 默认是一个空对象
//客户端使用?name=zs&age=20这种查询字符串形式发送到服务器参数
// 可以通过req.query对象访问到,例如:
// req.query.name req.query.age
// console.log(req.query);
res.send(res.query);
})
// 3、启动服务器
app.listen(80,()=>{
console.log("express server running at http://127.0.0.1");
})
6.1获取URL中的动态参数
//导入express
const express=require("express");
//创建服务器
const app=express();
//启动服务器
app.listen(80,()=>{
console.log("http://172.0.0.1");
}
//这里的:id是一个动态的参数
app.get('/user/:id',(req,res) =>{
// req.params是动态匹配的URl的参数,默认是一个空对象
// console.log(req,params);
res.send(req.params);
})
6.2托管静态资源
eg:
const express=require("express");
const app=express();
// 快速对外提供静态资源
app.use(express.static('./click'));
app.listen(80,()=>{
console.log("http://127.0.0.1");
})
nodemon(代码修改过后,服务器自动重启)
7express路由
7.1express路由
express路由的简单使用:
const express=require("express");
const app=express();
// 挂载路由
app.get('/',(req,res)=>{
res.send("hello wold");
})
app.post("/",(req,res)=>{
res.send("post request");
})
app.listen(80,()=>{
console.log("server running at http://127.0.0.1");
})
7.2模块化路由
eg:
router:
// 1导入express
const express=require("express");
// 2创建路由对象
const router=express.Router();
// 3挂载具体路由
router.get('/user/list',(req,res)=>{
res.send("get user list");
})
router.post('/user/add',(req,res)=>{
res.send('add new user');
})
// 4向外导出路由对象
module.exports=router;
server:
const express=require("express");
const app=express();
// 导入路由模块
const router=require('./router.js');
// 注册路由模块
app.use('/api',router);//use函数作用:注册全局中间件 api是地址前缀
app.listen(80,()=> {
console.log("http://127.0.0.1");
})
8、express中间件
8.1定义简单中间件
const express=require('express');
const app=express();
// 定义一个最简单的中间件函数
// const mw=function(req,res,next){
// //把流转关系,转交给下一个中间件或路由
// next();
// }
// // 将mv注册为全局生效的中间件
// app.use(mw);
// 全局中间件简化
app.use(function(req,res,next) {
next();
})
app.get('/',(req,res) =>{
res.send("home page");
console.log("调用了路由");
})
app.post('/user',(req,res)=>{
res.send("user page");
console.log("调用了路由");
})
app.listen(80,()=>{
console.log('http://127.0.0.1');
})
8.2 定义多个全局中间件
const express=require("express");
const app=express();
// 定义中间件1
app.use((req,res,next)=>{
console.log("调用了第一个中间件");
next();
})
// 定义中间件2
app.use((req,res,next)=>{
console.log("调用了第二个中间件");
next();
})
// 定义中间件3
app.use((req,res,next)=>{
console.log("调用了第三个中间件");
next();
})
// 定义路由
app.get('/',(req,res)=>{
res.send("user page");
})
app.listen(80,()=>{
console.log("http://127.0.0.1");
})
8.3局部生效的中间件
一个:
// 导入express模块
const express=require("express");
// 创建express服务器实例
const app=express();
// 定义中间件
// 定义中间件函数
const mw1=(req,res,next) =>{
console.log("局部调用");
next();
}
// 创建路由
app.get('/',mw1,(req,res)=>{
res.send("hoame page");
})
app.get('/user',(req,res) =>{
console.log("qidong");
})
// 启动服务器
app.listen(81,function() {
console.log("running at http://127.0.0.1");
})
多个:
// 导入express模块
const express=require("express");
// 创建express服务器实例
const app=express();
// 定义中间件
// 定义中间件函数
const mw1=(req,res,next) =>{
console.log("局部调用1");
next();
}
const mw2=(req,res,next) =>{
console.log("局部调用2");
next();
}
// 创建路由
app.get('/',mw1,mw2,(req,res)=>{
res.send("hoame page");
})
app.get('/user',(req,res) =>{
res.send("qidong");
})
// 启动服务器
app.listen(80,function() {
console.log("running at http://127.0.0.1");
})
8.4中间件分类
8.5自定义中间件
eg:
const express=require("express");
const app=express();
const qs=require("querystring");//导入node.js的querystring内置模块
// 解析表单数据的中间件
app.use((req,res,next)=>{
//定义中间件具体业务逻辑
// 1定义一个str字符串,专门用来存储客户端发过来的请求数据
let str='';
// 2监听req对象的data事件(客户端发过来的新的请求体数据)
req.on("data",(chunk)=>{
// 拼接请求体数, 隐式转换为字符串
str+=chunk;
})
// 3监听req的end事件
req.on('end',()=>{
// 在str中存放的是完整的请求数据
console.log(str);
// TODO:把字符串格式的请求体数据,解析成对象格式
const body=qs.parse(str);
// console.log(body);
req.body=body;
next();
})
})
app.post('/user',(req,res)=>{
res.send(req.body);
})
// 启动服务器
app.listen(80,function() {
console.log("http://127.0.0.1");
})
9使用express写接口
代码:
服务器:
const express=require("express");
// 创建服务器
const app=express();
// 配置解析表单数据中间件
app.use(express.urlencoded({extended:false}));
// 配置cors中间件,解决接口跨域问题 ----一定要在路由之前
const cors=require('cors');
app.use(cors());
// 导入路由模块
const router=require("./apiRouter");
// 把路由模块注册到app上
app.use('/api',router);
// 启动服务器
app.listen(80,function() {
console.log("http://127.0.0.1");
})
router:
const express=require("express");
const router=express.Router();
//挂载对应的路由
router.get('/get',(req,res)=>{
// 通过req.query获取客户端通过查询字符串,发送到服务器的数据
const query=req.query;
// 调用res.send()方法,向客户端响应处理结果
res.send({
status:0,//0表示处理成功,1表示处理失败
msg:'get请求成功',//状态的描述
data:query//需要响应给客户端的数据
})
})
router.post('/post',(req,res)=>{
// 通过req.body获取请求体包含的url-encoded格式的数据
const body=req.body;
// 调用res.send()方法,向客户端响应处理结果
res.send({
status:0,//0表示处理成功,1表示处理失败
msg:'post请求成功',//状态的描述
data:body
})
})
module.exports=router;
CORS跨域资源共享
9前后端的身份认证
9.1开发模式
9.2身份认证
9.2.1Session认证机制
代码:
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// TODO_01:请配置 Session 中间件
const session = require('express-session')
app.use(
session({
secret: 'itheima',
resave: false,
saveUninitialized: true,
})
)
// 托管静态页面
app.use(express.static('./pages'))
// 解析 POST 提交过来的表单数据
app.use(express.urlencoded({ extended: false }))
// 登录的 API 接口
app.post('/api/login', (req, res) => {
// 判断用户提交的登录信息是否正确
if (req.body.username !== 'admin' || req.body.password !== '000000') {
return res.send({ status: 1, msg: '登录失败' })
}
// TODO_02:请将登录成功后的用户信息,保存到 Session 中
// 注意:只有成功配置了 express-session 这个中间件之后,才能够通过 req 点出来 session 这个属性
req.session.user = req.body // 用户的信息
req.session.islogin = true // 用户的登录状态
res.send({ status: 0, msg: '登录成功' })
})
// 获取用户姓名的接口
app.get('/api/username', (req, res) => {
// TODO_03:请从 Session 中获取用户的名称,响应给客户端
if (!req.session.islogin) {
return res.send({ status: 1, msg: 'fail' })
}
res.send({
status: 0,
msg: 'success',
username: req.session.user.username,
})
})
// 退出登录的接口
app.post('/api/logout', (req, res) => {
// TODO_04:清空 Session 信息
req.session.destroy()
res.send({
status: 0,
msg: '退出登录成功',
})
})
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(80, function () {
console.log('Express server running at http://127.0.0.1:80')
})
9.2.2在express中使用session认证
9.3JWT认证机制
在express中使用JWT
代码:
// 导入 express 模块
const express = require('express')
// 创建 express 的服务器实例
const app = express()
// TODO_01:安装并导入 JWT 相关的两个包,分别是 jsonwebtoken 和 express-jwt
const jwt=require("jsonwebtoken");
const expressJWT=require("express-jwt");
// 允许跨域资源共享
const cors = require('cors')
app.use(cors())
// 解析 post 表单数据的中间件
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
// TODO_02:定义 secret 密钥,建议将密钥命名为 secretKey
const secretKey='itheima No1 ^_^';
// TODO_04:注册将 JWT 字符串解析还原成 JSON 对象的中间件
app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}));
// 登录接口
app.post('/api/login', function (req, res) {
// 将 req.body 请求体中的数据,转存为 userinfo 常量
const userinfo = req.body
// 登录失败
if (userinfo.username !== 'admin' || userinfo.password !== '000000') {
return res.send({
status: 400,
message: '登录失败!'
})
}
// 登录成功
// TODO_03:在登录成功之后,调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端
// 参数1:用户信息对象
// 参数2:加密密钥
// 参数3:配置对象,可以配置当前token的有效期
const tokenStr=jwt.sign({username:userinfo.username},scretKey,{expiresIn:'30s'});
res.send({
status: 200,
message: '登录成功!',
token: tokenStr // 要发送给客户端的 token 字符串
})
})
// 这是一个有权限的 API 接口
app.get('/admin/getinfo', function (req, res) {
// TODO_05:使用 req.user 获取用户信息,并使用 data 属性将用户信息发送给客户端
console.log(req.user);
res.send({
status: 200,
message: '获取用户信息成功!',
data: req.user // 要发送给客户端的用户信息
})
})
// TODO_06:使用全局错误处理中间件,捕获解析 JWT 失败后产生的错误
app.use((err,req,res,next)=>{
if(err.name==='UnauthorizedError'){
return res.send({
status:401,
message:'无效的token'
})
}
res.send({
status:500,
message:'未知错误',
})
})
// 调用 app.listen 方法,指定端口号并启动web服务器
app.listen(8888, function () {
console.log('Express server running at http://127.0.0.1:8888')
})