初衷:我並不想改變團隊原有開發模式,前端負責展示和界面路由,後端單純負責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