Node.js 前后端分离(解决同源的第三种方法)

后端负责数据传输和业务逻辑处理,前端负责页面交互,页面效果实现。

代理服务器

解决跨域的第三种方式,给前端一个服务器,通过服务器去访问服务器,就不去出现同源问题,同源问题是浏览器才会触发。

通过脚手架创建两个服务器,前端(frontend)和后端(server)。

具体流程:

1、通过电脑windowspowershell命令行运行(以管理员身份)Set-ExecutionPolicy RemoteSigned,选择全是,然后安装全局npm install express-generator -g。

(此步骤仅针对无无法直接创建工程的情况下使用)

Node.js 前后端分离(解决同源的第三种方法)_第1张图片

Node.js 前后端分离(解决同源的第三种方法)_第2张图片 

2、第一次需要安装全局:npm install express-generator -g,然后再通过express+项目名称创建工程。

Node.js 前后端分离(解决同源的第三种方法)_第3张图片 

3、安装依赖文件 npm install。

Node.js 前后端分离(解决同源的第三种方法)_第4张图片 

4、通过安装npm i -d nodemon,是服务器可以自动启动更新,不需要手动启动 。

Node.js 前后端分离(解决同源的第三种方法)_第5张图片 

5、在json文件下把start的node改成nodemon。

Node.js 前后端分离(解决同源的第三种方法)_第6张图片 

6、同样的方式安装一个后端服务器。

Node.js 前后端分离(解决同源的第三种方法)_第7张图片 

Node.js 前后端分离(解决同源的第三种方法)_第8张图片 

7、npm start 启动服服务器。

注:后端路由现在对于我们来说就是一个获取数据的接口地址。

前端服务器解决同源跨域问题

注:如果直接通过浏览器去访问后端服务器,就会触发同源问题,如果通过浏览器访问前端服务器,然后前端服务器在去访问后端服务器就解决这个问题。

Node.js 前后端分离(解决同源的第三种方法)_第9张图片

Node.js 前后端分离(解决同源的第三种方法)_第10张图片 原理图:

Node.js 前后端分离(解决同源的第三种方法)_第11张图片

第一种:利用前端服务器进行一次中转

1、在前端的浏览器页面先引入axios文件(比较常用,因为它可以在前后端同时使用),通过浏览器去访问前端服务器。

Node.js 前后端分离(解决同源的第三种方法)_第12张图片

具体代码:



 2、在前端服务器安装npm i axios文件,在路由里引入,接收浏览器的请求,并向后端服务发送请求,解决跨域问题。

Node.js 前后端分离(解决同源的第三种方法)_第13张图片

具体代码:

/* 引入axios文件,解决浏览器产生的同源问题 */
const axios = require("axios");

/* 通过访问getData,使用异步请求去访问后端服务器的路径,得到数据并返回浏览器 */
router.get('/getData', async function(req, res, next) {
    let resp = await axios.get("http://127.0.0.1:3001/user");
    res.send(resp.data);
});

 3、就可以直接访问到后台的数据了。

Node.js 前后端分离(解决同源的第三种方法)_第14张图片

 

第二种:http-proxy-middleware中间件

由于第一种比较麻烦,每一次我们都需要通过前端服务器进行一次中转,就需要使用中间件代理去处理。

步骤:

1、在前端安装中间件,可以直接区分浏览器时请求前端服务器还是后端的数据。

npm i http-proxy-middleware

2、进行配置。

app.js文件中引入 http-proxy-middleware 中间件并进行相关配置。

主要就是在路径处识别/api,如果发现有/api就会被中间件拦截,把地址改成 target的路径,并且把/api改成了/。只要有/api就会识别是访问后端的,没有就是访问前端自己的。

//引入文件
const { createProxyMiddleware } = require('http-proxy-middleware');
​
//配置
var options = {
  target: 'http://127.0.0.1:3001', // 后端目标服务器地址
  changeOrigin: true, // 默认 false,是否需要改变原始主机头为目标 URL
  pathRewrite: {
    '^/api': '/', // 所有以 "/api" 开头的请求,"/api" 都会重写为 "/",简单来说,就是通过这个/api,区分到底是代理服务器本地的请求,还是需要进行转发到后端目标服务器的请求
  },
};
​
//使用
app.use("/api",createProxyMiddleware(options));

经过以上配置,客户端发送的所有以 /api 开头的请求,都会直接被代理服务器转发到 3001 端口的目标服务器中。

3、中间件使用。

3.1、可以区分是访问前端还是后端,如果直接访问路径,就会被中间件拦截,执行前端的方法。

 Node.js 前后端分离(解决同源的第三种方法)_第15张图片

Node.js 前后端分离(解决同源的第三种方法)_第16张图片 

Node.js 前后端分离(解决同源的第三种方法)_第17张图片 

3.2、如果路径加了/api就会根据中间件的配置去访问后端的某个接口。 Node.js 前后端分离(解决同源的第三种方法)_第18张图片 

Node.js 前后端分离(解决同源的第三种方法)_第19张图片 

Node.js 前后端分离(解决同源的第三种方法)_第20张图片 

 

 

 

你可能感兴趣的:(javascript,开发语言,前端)