node基础

目录

1、fs文件系统模块

1.1读取指定文件内容

1.2向指定文件写入内容

2、path路径模块

2.1获取路径中文件名

2.2获取路径扩展名部分

3、http模块

 3.1创建web服务器

3.2根据不同的url响应不同的html内容

4、模块化

4.1概念

 ​编辑

 4.2加载模块

 4.3模块作用域

4.3.1module对象

 5、npm与包

5.1创建package.json包

dev节点

 包的分类:

6、express

6.1获取URL中的动态参数

6.2托管静态资源

 7express路由

7.1express路由

 7.2模块化路由

8、express中间件

8.1定义简单中间件

8.2 定义多个全局中间件

8.3局部生效的中间件

 8.4中间件分类

 8.5自定义中间件

9使用express写接口

9前后端的身份认证

9.1开发模式

9.2身份认证

 9.2.1Session认证机制

 9.2.2在express中使用session认证

 9.3JWT认证机制


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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值