【Nodejs】Express实现接口

news2024/11/22 20:38:43

介绍

  • Express 是一个第三方模块,用于快速搭建服务器 类似于jquery与DOM
  • Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架
  • express保留了http模块的基本API,使用express的时候,也能使用http的API
  • express还额外封装了一些新方法,能让我们更方便的搭建服务器
    Express 官网
    Express 中文文档(非官方)
    Express GitHub仓库

node框架

node-http模块 ==⇒ express框架 ==⇒ koa =⇒ egg.js

安装

npm i express

express封装的新方法

  • express
    • express.static() – 开放静态资源
    • express.urlencoded() – 获取POST请求体
  • app
    • app.get() – 处理客户端的GET请求
    • app.post() – 处理客户端的POST请求
    • app.use() – 设置应用级别的配置
  • req
    • req.body – 获取POST请求体
    • req.params – 获取GET请求动态参数
    • req.query – 获取GET请求参数(获取查询字符串参数)
  • res
    • res.sendFile(文件的绝对路径) – 读取文件,并将结果响应
    • res.set({name, value}) – 设置响应头
    • res.status(200) – 设置响应状态码
    • res.send(字符串或对象) – 响应结果
    • res.json(对象) – 以JSON格式响应结果
    • res.jsonp() – 以JSONP格式响应结果

请注意,在express中,我们仍然可以使用http模块中的方法。

简单请求和复杂请求

简单请求

符合以下条件的,为简单请求

  1. 请求方式只能 为:GET, HEAD , POST
  2. 且Content-Type的值仅限于
    • text-plain
    • multipart/form-data
    • application/x-www-form-urlencoded

复杂请求

特点:发两次请求

会先发一次预检请求 OPTIONS

如果OPTIONS中又允许跨域的头信息,浏览器会发第二次请求

使用Express构造Web服务器

nodemon 启动服务。
在这里插入图片描述

步骤

  1. 加载 express 模块
  2. 创建 express 服务器
  3. 开启服务器
  4. 监听浏览器请求并进行处理
// 1. 导入express模块
const express = require('express')
// 2. 创建服务器
const app = express()
// 3. 启动服务器
app.listen(3000, function () {
  console.log('服务器启动成功')
})

// express 处理用户请求
// app.get() 用于处理用户的get请求
// app.post() 用于处理用户的post请求
app.get('/index',(req,res) => {
  res.send('你好,新世界')
})
app.get('/login', (req,res) => {
  res.send('<h1>哈哈</h1>')
})
// 更多的是返回一个数据(express自动把这个对象转化为JSON )
app.get('/user', (req,res) => {
  res.send({
    name: 'zs',
    age: 18,
    gender: '女'
  })
})

实现get接口

接口服务器:

根据用户的请求返回数据(JSON数据)

实现一个简单的get接口

const express = require('express')

const app = express()
app.listen(3000, () => {
  console.log('服务器启动成功了')
})
app.get('/login', (req, res) => {
  // 允许该接口跨域访问  CROS
  res.setHeader('Access-Control-Allow-Origin', '*') // *表示都可以跨域访问
  res.send({
    code: 200,
    message: '成功'
    
  })
})

获取查询字符串

什么是查询字符串?

url地址后面的这些:
在这里插入图片描述

使用req.query获取查询字符串

  • 接口
const express = require('express')

const app = express()
app.listen(3000, () => {
  console.log('服务器启动成功了')
})
app.get('/login', (req, res) => {
  // 允许该接口跨域访问
  res.setHeader('Access-Control-Allow-Origin', '*') // *表示都可以跨域访问
  console.log(req.query)
  const {username, password} = req.query
  if(username === 'admin' && password === '123456') {
    res.send({
      code: 200,
      message: '成功'
    })
  } else {
    res.send({
      code: 400,
      message: '用户名或密码错误'
    })
  }
})

获取到的查询字符串:

在这里插入图片描述

  • 页面
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <input type="text" placeholder="请输入用户名" class="username">
  <br>
  <input type="text" placeholder="请输入密  码" class="pwd">
  <br>
  <button>登录</button>
  <script src="node_modules/axios/dist/axios.js"></script>
  <script>
    document.querySelector('button').onclick = async function () {
      const username = document.querySelector('.username').value
      const password = document.querySelector('.pwd').value
      const res = await axios({
        method: 'get',
        url: 'http://localhost:3000/login',
        params: {
          username,
          password
        }
      })
      console.log(res)
    }
  </script>
</body>
</html>

获取动态参数

url/:id/:name/:age :后面的就叫动态参数

使用req.params获取动态参数

app.get('/getUser/:id', (req, res) => {
  // 允许该接口跨域访问
  res.setHeader('Access-Control-Allow-Origin', '*')
  console.log(req.params)
  res.send({
    id: req.params.id,
    name: 'zs',
    age: 10

  })
})

在这里插入图片描述
在这里插入图片描述

接口风格

目前比较流行的是rest风格, 即简洁的接口风格

表现: id直接拼接到url中,也就是使用动态参数

实现post请求

注意:由于post请求的Content-Typeapplication/json , 所以它是一个复杂请求。

发送post请求步骤

  1. 处理所有的options请求
app.options('*', (req, res) => {
  // 允许CORS跨域的域名
  res.setHeader('Access-Control-Allow-Origin', '*')
  // 允许CORS跨域的请求方式,默认只有GET,POST
  res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE')
  // 允许CORS跨域请求的请求头
  res.setHeader('Access-Control-Allow-Headers', 'content-type')
  res.send(null)
})
  1. 发送post请求
app.post('/login', (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  res.send({
    code: 200,
    message: '登陆成功'
  })
})
  1. 如果要拿到post请求的请求体
    • 使用req.body
    • 必须使用一个**内置的中间件 **express.json()
app.use(express.json())
...
...
app.post('/login', (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*')
  console.log(req.body)
  res.send({
    code: 200,
    message: '登陆成功'
  })
})

在这里插入图片描述
在这里插入图片描述

服务器端接收不同类型的请求体,使用的方式是不同的

  • urlencoded —> app.use(express.urlencoded({extended: false}));
  • application/json —> app.use(express.json()); – 没有演示
  • form-data —> 服务器端使用第三方模块处理(multer

中间件

特质业务处理流程中的中间处理环节
在这里插入图片描述

  • 中间件就是一个函数, 一般写在请求之前

  • 有三个基本参数

    • req 请求相关的对象
    • res 响应相关的对象
    • next 函数,必须调用next 中间件才会向下传递
    const express = require('express')
    const app = express()
    // app.use(中间件) // 所有的请求之前都会调用中间件
    const middle = function (req, res, next) {
      console.log('我是中间件')
      // 处理完一定要记得调用next
      next()
    }
    app.use(middle)
    app.listen(3000, () => {
      console.log('服务器启动了')
    })
    
    app.get('/login', (req, res) => {
      res.send('登录')
    })
    app.get('/user', (req, res) => {
      res.send('用户')
    })
    app.get('/index', (req, res) => {
      res.send('首页')
    })
    

在这里插入图片描述

用中间件解决跨域

声明一个中间件AllowCrossDomain

const express = require('express')
const app = express()
// app.use(中间件) // 所有的请求之前都会调用中间件
const AllowCrossDomain = function (req, res, next) {
  // 允许CORS跨域的域名
  res.setHeader('Access-Control-Allow-Origin', '*')
  // 允许CORS跨域的请求方式,默认只有GET,POST
  res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE')
  // 允许CORS跨域请求的请求头
  res.setHeader('Access-Control-Allow-Headers', 'content-type')
  // 处理完一定要记得调用next
  next()
}
app.use(AllowCrossDomain)
app.listen(3000, () => {
  console.log('服务器启动了')
})

app.post('/login', (req, res) => {
  res.send({
    code: 200,
    message: '登陆成功'
  })
})
app.get('/user', (req, res) => {
  res.send('用户')
})
app.get('/index', (req, res) => {
  res.send('首页')
})

express内置的中间件

  1. static

静态资源

// img是一个文件夹
// 直接把img作为公共的静态资源目录
app.use(express.static('img'))
  1. urlencoded
  • 处理application/x-www-form-urlencoded
  • 把请求体挂到req.body上
  1. json
    • 处理application/json
    • 把请求体挂到req.body上

一般 2, 3 同时使用

// 处理json数据
app.use(express.json())
// 处理form-urlencoded数据
app.use(express.urlencoded({extended: false}))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/494951.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【花雕学AI】我们如何才能避免被ChatGPT替代?——一个跨学科的视角

ChatGPT是一个由OpenAI开发的AI文本工具&#xff0c;它可以理解和生成自然语言&#xff0c;从而与用户进行对话。ChatGPT是基于GPT-3或者GPT-4模型的&#xff0c;这是目前最大和最先进的语言模型之一。ChatGPT通过在大量的互联网文本数据上进行预训练和强化学习&#xff0c;学习…

linux修改程序的配置文件

修改指定文件中的数&#xff0c;例如创建一个文件如图 把6修改成7 修改完成 代码如下&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #incl…

【英语】大学英语CET考试,阅读部分1(阅读概述,SectionC仔细阅读140)

文章目录 1、阅读概述1.1 考试概况&#xff1a;大纲解读备考策略1.2 做题原则&#xff1a;定位1.3 标点符号和句子逻辑1.4 一级词汇 2、细节题&#xff08;10题占9题&#xff09;2.1 逻辑关系&#xff08;并列和递进&#xff0c;同一方向&#xff09;2.2 逻辑关系&#xff08;转…

Flutter学习之旅 -AspectRatio Card CircleAvatar组件

文章目录 AspectRatioCardCircleAvatar定义方法封装 AspectRatio AspectRatio的作用是根据设置调整子元素child的宽高比。 class MyHomePage extends StatelessWidget {const MyHomePage({Key? key}) : super(key: key);overrideWidget build(BuildContext context) {//获取设…

解决文件夹显示“文件夹变文件”的方法

在文件夹属性设置中&#xff0c;找到“文件名”&#xff0c;双击一下&#xff0c;选中的项目就会显示为“文件夹”&#xff0c;如果没有选中&#xff0c;点击“打开文件夹”就可以了。这是因为系统在默认情况下&#xff0c;所有的文件夹都是以系统默认的路径来命名的。当然也有…

构建 Kubernetes Operator 的原则是什么?

Kubernetes&#xff08;简称K8s&#xff09;上数据服务的自动化越来越受欢迎。在K8s上运行有状态的工作负载意味着使用Operator。然而&#xff0c;它发展演化到今天已经变得非常复杂&#xff0c;像Operator这样的应用模式和扩展方式对于开发者与运维者而言愈发受到欢迎。 但工…

【勝讯云 Finops Crane 集训营】基于 FinOps 的云资源分析与成本优化平台实操及说明

介绍 Crane 是由腾讯云主导开源的国内第一个基于云原生技术的成本优化项目&#xff0c;遵循 FinOps 标准&#xff0c;已经获得FinOps基金会授予的全球首个认证降本增效开源方案。它为使用 Kubernetes 集群的企业提供了一种简单、可靠且强大的自动化部署工具。 Crane 的设计初衷…

来这公司一年碰到的问题比我过去10年都多

无意间发现我们 Kafka 管理平台的服务的 open files 和 CPU 监控异常&#xff0c;如下图&#xff0c;有一台机器 CPU 和 opfen files 指标持续在高位&#xff0c;尤其是 open files 达到了4w。 原因分析 第一反应是这个服务请求很高&#xff1f;但是这个服务是一个管理服务不应…

云安全的挑战与发展:云原生安全将是未来趋势吗?

引言 随着企业数字化转型的推进和云计算的普及&#xff0c;云安全已经成为了当下IT行业的热点话题之一。尽管云计算已经被广泛应用&#xff0c;但在云安全方面仍存在一些挑战和问题。本文将探讨当前云安全面临的挑战&#xff0c;并分析云原生安全在未来的发展趋势。 第一章 云…

Opera One将取代 Opera 浏览器

导读Opera 日前推出了一款名为 Opera One 的新浏览器&#xff0c;该浏览器正处于开发者预览阶段&#xff0c;用户可以访问官网下载试用&#xff08;链接&#xff09;。这个浏览器的终极目标是在今年晚些时候取代其当家的 Opera 浏览器。 Opera One 遵循 "模块化设计理念&q…

Netty(2)

Netty 文章目录 Netty4 Netty 模型4.1 Netty 模型介绍4.2 Netty demo4.3 Netty 异步模型4.3.1 基本介绍4.3.2 异步模型4.3.3 Future-Listener 机制4.4 Netty 任务队列 task 4 Netty 模型 4.1 Netty 模型介绍 Netty 线程模式&#xff1a;Netty 主要基于主从 Reactor 多线程模型…

2023年开源社项目委员会介绍

2023 项目委员会成员 项目委员会主席&#xff1a;石垚 &#xff08;tech-querykaiyuanshe.org&#xff09; 项目委员会秘书 &#xff1a;丁文昊 &#xff08;dingwenhaokaiyuanshe.org&#xff09; 开源社官网项目组&#xff1a; 组长&#xff1a;石垚 &#xff08;tech-queryk…

2023 ATTCK v13版本更新指南

一、什么是ATT&CK ATT&CK&#xff08;Adversarial Tactics, Techniques, and Common Knowledge &#xff09;是一个攻击行为知识库和模型&#xff0c;主要应用于评估攻防能力覆盖、APT情报分析、威胁狩猎及攻击模拟等领域。 二、ATT&CK 发展历史 1996年&#xff1…

【UE】高级载具插件-04-坦克瞄准开火

在上一篇文章中&#xff08;【UE】高级载具插件-03-子弹击中目标时使目标破碎&#xff09;&#xff0c;我们实现了坦克开火的功能。本篇博客介绍的是实现坦克瞄准开火的功能。 效果 步骤 1. 首先将学习FPS游戏时用到的动态准心控件蓝图资源导入 2. 在项目设置中增加两个操作…

穿越有序链表的迷宫:探索力扣“合并两个有序链表”的解题思路

本篇博客计划讲解力扣“21. 合并两个有序链表”这道题&#xff0c;这是题目链接。 老规矩&#xff0c;先来审下题干。 输出示例如下&#xff1a; 提示&#xff1a; 这道题目相当经典&#xff0c;同时是校招的常客。大家先思考一下&#xff0c;再来听我讲解。 思路&…

7.1 幂法和反幂法

学习目标&#xff1a; 如果我要学习幂法及反幂法&#xff0c;我会遵循以下步骤&#xff1a; 1. 学习理论知识&#xff1a;首先我会找到可靠的教材或者网上资源&#xff0c;学习幂法及反幂法的理论知识&#xff0c;包括其原理、公式、算法流程、收敛性等方面的内容。这些知识可…

Cadence Allegro BGA类器件扇孔操作教程

对于BGA扇孔&#xff0c;同样过孔不宜打孔在焊盘上&#xff0c;推荐打孔在两个焊盘的中间位置。很多工程师为了出线方便&#xff0c;随意挪动BGA里面过孔的位置&#xff0c;甚至打在焊盘上面&#xff0c;如图1所示&#xff0c;从而造成BGA区域过孔不规则&#xff0c;易造成后期…

3.shell脚本例子

文章目录 1.计算从1到100所有整数的和2.提示用户输入一个小于100的整数&#xff0c;并计算从1到该数之间所有整数的和3.求从1到100所有整数的偶数和、奇数和4.用户名存放在users.txt文件中&#xff0c;每行一个&#xff0c;判断文件里的用户是否存在&#xff0c;若该用户存在&a…

【Java EE】-Servlet(一) 创建Maven下的webapp项目

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【JavaEE】 分享: 在满园弥漫的沉静的光芒之前&#xff0c;一个人更容易看到时间&#xff0c;并看到自己的身影。——史铁生《我与地坛》 主要内容&#xff1a;创建一个基于maven…

【云计算•云原生】5.云原生之初识OpenStack

文章目录 OpenStack起源OpenStack基本组件HorizonNovaSwiftCinderKeystoneNeutronGlanceCeilometerTroveHeat OpenStack简单框架模型 OpenStack起源 OpenStack是一个由NASA和Rackspace合作研发并发起的&#xff0c;以Aapache许可证授权的自由软件和开放源代码项目。为公有云及…