初衷:我并不想改变团队原有开发模式,前端负责展示和界面路由,后端单纯负责API;
要解决的问题:
1.服务端渲染(部分界面【商品界面】须要使用服务器端渲染,可是管理类型界面并不须要服务器端渲染);
2.因为问题1的出现,因此咱们须要服务器端渲染,须要控制路由,须要部分界面使用后端模板引擎。
3.固然我不想写两套api请求方式,Node.js能够搞定使用一套方案;
4.后台服务请求固然走代理服务。
方案选择:
1.koa2基础框架
2.axios--api请求服务
3.http-proxy--代理转发
其他日志处理,路由,后端模板引擎,异步语法本身选择了。
具体实现【仅供参考】:
1.代理转发【写koa2中间件】:匹配请求路由代理转发目标服务器前端
//中间件request_proxy.js var httpProxy = require('http-proxy'); //EG:http://localhost:3001/rs-server-api/v1/goods/list var proxy = new httpProxy.createProxyServer({ target: 'https://stage.recovery-server.jiahuyunyi.com/', changeOrigin: true // for vhosted sites, changes host header to match to target's host }); var response_formatter = (ctx) => { proxy.web(ctx.req, ctx.res); ctx.body = ctx.res; } var url_filter = (pattern) => { return async (ctx, next) => { var reg = new RegExp(pattern); try { //经过正则的url进行格式化处理 if (reg.test(ctx.originalUrl)) { response_formatter(ctx); } await next(); } catch (error) { //继续抛,让外层中间件处理日志 throw error; } } } module.exports = url_filter;
const request_proxy = require('./middlewares/request_proxy'); //匹配路由/rs-server-api/v1/ app.use(request_proxy('^/rs-server-api/v1/'));
2.后端服务:固然ajax请求也是用这个jsnode
import axios from "axios"; //没有权限直接跳转到登陆界面 function fetchGoodsList() { return axios.get('http://localhost:3001/rs-server-api/v1/goods/list'); } export default { fetchGoodsList: fetchGoodsList }
在controller中调用服务ios
var router = require('koa-router')(); var Service = require('../services/index.js'); router.get('/', async function (ctx, next) { ctx.state = { title: await Service.fetchGoodsList().then((response) => { return JSON.stringify(response.data); }) }; await ctx.render('index', { }); }) module.exports = router;
最后项目DEMO地址,基于不少位前辈代码,仅仅加入代理转发
https://github.com/HereSincer...git