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的接口

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

相关推荐
Q一件事4 小时前
ArcGIS中TypeError: can‘t multiply sequence by non-int of type ‘str‘错误
前端·javascript·arcgis
美狐美颜SDK开放平台4 小时前
从视频处理到实时渲染:直播APP中视频美颜SDK的关键技术解析
前端·人工智能·架构·实时互动·音视频·视频美颜sdk
WeiXin_DZbishe4 小时前
基于springboot大学生提问箱系统-计算机毕设【课程设计】72593
javascript·vue.js·spring boot·vscode·python·node.js·php
yume_sibai4 小时前
ES6 核心知识点完全总结(变量 + 箭头函数 + 解构 + Promise + 模块化)
前端·ecmascript·es6
Moment4 小时前
为什么市面上的 coding agent 大多数都基于Nodejs?
前端·后端·面试
吃瓜的猹5 小时前
Gemini 3.8 Flash 是真的站起来了,一起来看看我到底做了什么吧~
前端
光影少年5 小时前
React18 对RN 的影响
android·前端·react.js·ios·前端框架
tryCbest5 小时前
Vue Router学习及使用
前端·vue.js
杉氧5 小时前
丝滑的奥秘:Reanimated 3 动画引擎与手势处理(Gesture Handler)
android·前端·react native
用户970161501685 小时前
浏览器切到后台后,AI 给我的代码就失效了:我拿 3 个模型测了 6 个定时器坑
前端·代码规范