Node.js(五)——编写接口

一、创建基本的服务器和API模块

1.基本的服务

复制代码
const express=require('express')


const app=express()


const router=require('./jiekou.js')

app.use('/api',router)//加一个统一的前缀 /api

app.listen('80',()=>{
  console.log('80端口已开启')
})

2.API路由模块

复制代码
const express=require('express')
const apiRouter=express.Router()
// 这里挂载对应的路由



module.exports=apiRouter

前端的路由是用来切换页面的,后端的路由是用来返回数据的,像里面的/user是路径,但是那一小堆就是路由

二、编写GET接口

复制代码
const express=require('express')
const apiRouter=express.Router()
// 这里挂载对应的路由


apiRouter.get('/userInfo',(req,res)=>{
  console.log(req.query)

  res.send({
    status:0,
    msg:'GET success!',
    data:req.query
  })
})

module.exports=apiRouter

三、编写POST接口

post传的参数是放在body里的,get参数师放在query里的

如果是body里的数据我们不能直接用req.body来直接拿到(大部分情况),需要配置一个中间件

POST 传参方式 请求头 Content-Type 是否需要中间件 用什么中间件
JSON application/json ✅ 需要 express.json()
表单 application/x-www-form-urlencoded ✅ 需要 express.urlencoded({ extended: false })
文件上传 multipart/form-data ✅ 需要(但不是用 express 自带的) multerformidable
纯文本 text/plain ❌ 不需要(但很少用) 手动处理原始数据流

而且配置的这个中间件我们只需要配置一次全局都能用,就配置在app.use所在的页面

复制代码
app.use(express.json())
app.use(express.urlencoded({extended:false}))

注意这两句引入中间件一定要写在app.use('/api',router)的前面!

第二个里面的extended,express.json里是不支持的

传false的意思就是使用 Node.js 内置的 querystring 模块,不支持嵌套对象(不能传个对象里面还套了一层对象)

四、CORS跨域

1.接口的跨域问题

跨域问题:协议、域名、端口号任一一个不同就会引起跨域问题

解决方案:

  • CORS(主流方法,推荐使用)
  • JSONP(有缺陷,只适用于get请求)

2.什么是CORS

CORS(Cross-Origin Resource Sharing,跨域资源共享),由一系列的http响应头组成,这些http响应头决定了浏览器是否阻止前端JS代码跨域获取资源。

浏览器默认的"同源策略"会阻止网页跨域获取资源,配置了CORS之后就可以解除。

注意:

  • CORS是在服务端配置的,客户浏览器无需做额外配置
  • CORS有兼容性,只支持在XMLHttpRequest Level2的浏览器,才能正常访问开启了CORS的服务端接口(例如:IE 10+、Chrome4+、FireFox3.5+)

3.使用CORS来解决跨域问题

CORS是Express的一个中间件

使用步骤:

  1. 安装npm install cors
  2. 引入const cors=require('cors')
  3. 在路由之前app.use(cors())来配置中间件,注册为全局可用中间件

4.CORS相关的3个响应头

  • Access-Control-Allow-Origin:<origin>|*,可以是具体的某个域名,也可以是*(全部)
  • Access-Control-Allow-Headers:默认情况下,服务端允许客户端发送9个请求头

如果超过这个范围的话,就需要在Access-Control-Allow-Headers声明一下,否则会请求失败

res.setHeader('Access-Control-Allow-Headers','Content-type')

  • Access-Control-Allow-Methods:默认情况下,CORS只允许客户端发送get、post、head请求。

res.setHeader('Access-Control-Allow-Methods','PUT,DELETE')

res.setHeader('Access-Control-Allow-Methods','*')

5.CORS请求的分类

CORS的请求根据请求方式和请求头可以将请求分为两大类:

  • 简单请求:请求方式是GET、POST、HEAD之一&&头部信息不超过上面那九个范围的
  • 预检请求:请求方式超出那三个的 || 头部信息不属于那九个的 || 向服务器发送了application/json格式的数据

预检请求是浏览器与服务器正式发起请求前,浏览器会先发送OPTION请求进行预检,以获知服务器是否允许该请求,服务器响应了该预检请求之后,才会发送真正的请求,并且携带真实数据。

简单请求与预检请求的区别

简单请求:客户端与服务端直接只进行一次请求

预检请求:客户端与服务端之间会发送两次请求,预检+真正请求

6.JSONP接口

JSONP是用<script 标签里的src属性来请求服务器上的数据的,同时服务器返回一个函数的调用,这种请求方式叫JSONP。

特点:

  • 不属于Ajax请求,因为他没有使用XMLHttpRequest这个对象
  • 只支持Get请求

注意如果项目中已经配置了CORS的话,要在CORS中间件声明之前就声明JSONP的接口,否则JSONP接口会被处理成开启了CORS的接口

这个现在基本不用了就不再多介绍了

相关推荐
东方小月2 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
Csvn3 小时前
🧩 ESM vs CJS 混用的 7 个「天坑」——从 TypeScript 编译到 Node 与浏览器
前端
Csvn3 小时前
🎯 Web 性能 API 集合:Performance Observer 的 5 个冷门妙用
前端
Csvn3 小时前
深入 React 闭包陷阱:从根源上理解并根治 stale closure
前端
whyfail3 小时前
前端学 Spring Boot(8):接口为什么越用越慢?
前端·spring boot·后端
用户059540174464 小时前
LangChain 记忆测试踩坑实录:这两个坑让我排查了 4 小时
前端·css
程序员黑豆4 小时前
鸿蒙应用开发:@Monitor 装饰器使用教程
前端·harmonyos
用户938515635074 小时前
从零构建《天龙八部》知识库:EPUB 加载→文本分割→向量嵌入→Milvus 存储→RAG 问答,一条链路打通
javascript·人工智能·全栈
SamChan904 小时前
在Web应用中集成PDF多语言翻译功能:PDFTranslator API实战指南
前端·python·ai·pdf·yapi·机器翻译
kyriewen5 小时前
AI Agent 9秒删光了生产数据库——我给自己的项目做了5个紧急检查
前端·ai编程·claude