用Express实现接口和解决跨域问题

275 阅读3分钟

Express基本介绍

Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架。

  • 框架:是一个半成品,用来快速解决一类问题;库就是工具集,使用非常灵活) (框架有:bootstrap, lay-ui, express, vue, react ; 库:zepto.js , jQuery,  day.js, underscore, lodash, art-template, axios, echart.....)

  • web 开发: 对不同的请求能够显示页面;提供接口服务; 理解:

  • 我们前面用http模块来支持web服务,现在要用express来写web服务

  • 对于node.js来说,Express 是一个第三方模块,有丰富的 API 支持,强大而灵活的中间件特性

  • Express 不对 Node.js 已有的特性进行二次抽象,只是在它之上扩展了 Web 应用所需的基本功能

express写get接口

express框架会自动收集get类型的接口从url地址中传递的查询字符串参数,并自动保存在req对象的query属性中。我们直接使用,代码如下。

//引入文件
const express = require('express');
//2.创建服务器
let app = express()
app.use(express.urlencoded())
app.get('/get', function (req, res) { 
  console.log(req.query);
  res.send({ stasus: 200 })
})
//3.开启服务器
app.listen(3000, () => {
  console.log('success')
})

express写post接口

post接口与get请求不同在于:它的参数一般是通过请求体来传递的。根据传递的参数的格式不同,分成三种情况来说

  • 传递普通键值对
  • 传递form表单(涉及文件上传)
  • 传递json

post接口-普通键值

具体来说当请求头的content-type为x-www-form-urlencoded时,表示上传的普通简单键值对 。示例:

//引入文件
const express = require('express');
//2.创建服务器
let app = express()
// 使用中间件
app.use(express.urlencoded());
app.post("/add",function(req,res){
// 可以通过req.body来获取post传递的键值对	
// res.json是express提供的一个函数,用来返回一个json数据给客户端,同时会结束请求
// 类似于res.end, res.send()
    res.json(req.body)
})

post接口-json格式的参数

var data = {
 name:"abc",
 address:{
     "a":1,
     "b":2,
     "info":"c"
 }
}

在post传递参数时,如要传入以上比较复杂的参数(多级嵌套),则可以使用json格式上传。示例:

//引入文件
const express = require('express');
//2.创建服务器
let app = express()
// 使用中间件
app.use(express.json());
// 会自动加入req.body属性,这个属性中就包含了post请求所传入的参数
// 用来处理JSON格式的数据
app.post('/postJSON',(req,res)=>{
    // 后端收到post传参
    console.log(req.body); 
    res.send('/postJSON')
})

post接口-form-data文件上传

如果post涉及文件上传操作,则需要在服务器端额外使用第三方multer这个包(不属于express)来获取上传的信息。

Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。

// 1. 引入包
const multer = require('multer');
// 2. 配置
const upload = multer({dest:'uploads/'}) // 上传的文件会保存在这个目录下
// uploads表示一个目录名,你也可以设置成其它的
// 3. 使用
app.post("/postfile",upload.single('cover'), function(req,res){
    // req.file 记录了文件上传的信息
    // req.body 记录了其它普通参数(非文件)的信息
	  // 其它操作
})

说明:

  • 如果当前目录下没有uploads,它会自动创建uploads这个文件夹
  • upload.single只是处理了文件的上传。你仍可以通过req.body来获取其它参数

跨域问题

什么原因导致了浏览器报跨域错误

发起ajax请求的那个页面的地址 和 ajax接口地址 不在同一个域中(即不同源)

不同源Ajax请求 会导致浏览器报跨域错误 同源是指:协议相同域名相同端口相同 都相同。 说明:后端还是能收到请求的,错误是发生在浏览器端

解决思路

  • 可以安装一个浏览器插件allow-control-allow-origin 绕过同源策略。
  • 第三方包CORS