一、解决接口跨域问题
在第一次用node做前后端分离的项目时,本地用postman自测接口信心满满(无bug,无bug... ),
没想到第一次前后端接口联调就出问题了,访问不同报跨域问题,绞尽脑汁,各种百度,说法不一。有从前端控制的,有从后端控制的,最后慎之又慎,选用koa2-cors来解决
frist来说一下啥是跨域
由于浏览器同源策略,凡是发送请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域。存在跨域的情况:
网络协议不同,如http协议访问https协议。
端口不同,如80端口访问8080端口。
域名不同,如abc.com访问baidu.com。
子域名不同,如a.abc.com访问b.abc.com。
域名和域名对应ip,如www.abc.com访问123.246.789.001(举例子).
跨域请求资源的方法
JSONP跨域
nginx反向代理
服务器端修改heade
document.domain
window.name
postMessage等等
顺便提一嘴 cookie、session等也存在这种问题哈
呵呵;
上代码:yarn add koa2-cors
在app.js中添加
const cors = require('koa2-cors');
app.use(cors({
origin: function (ctx) {
if (ctx.url === '/test') {
return 'abc.com';// 允许特定域名请求
}
return '*';// 允许来自所有域名请求
},
exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'],
maxAge: 5,
credentials: true,
allowMethods: ['GET', 'POST', 'DELETE', 'PUT'],
allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
}));
二、使用koa-body替代koa-bodyparser和koa-multer
使用 koa2 的时候,默认处理 post 请求使用的是 koa-bodyparser,同时如果是图片上传使用的是 koa-multer。
这两者的组合没什么问题,不过 koa-multer 和 koa-route(注意不是 koa-router) 存在不兼容的问题。
使用koa-body可以解决不兼容问题,而且完全具备两者功能,一举两得的事情,毫不犹豫替换。
上代码:
yarn add koa-body
在app.js中添加
const koaBody = require('koa-body');
app.use(koaBody({
enableTypes: ['json', 'form', 'text', 'file'],
multipart: true,//支持文件上传
formidable: {
maxFileSize: 2000 * 1024 * 1024 // 设置上传文件大小最大限制,默认2M
}
}));
koa-body 基本参数
formidable 的相关配置参数
三、引入require-directory遍历routes目录引入路由
在项目中,一开始路由文件很少,每次增加一个路由文件,就往app.js文件中添加对应的路由文件。随着项目的进行,日积月累的app.js中的路由文件越来越多,越来越臃肿,就想有没有一种可行的办法可以一次加载,使其看起来不再那么臃肿。
有,必须的,只要是问题总有解决方案;
一开始的做法是自己写了一个中间件,把路由通过中间件加入到app.js中,嗯,可行,但是只是给他们换了个位置而已,无感受。
后面就把router目录下的文件读取做循环,嗯,有点意思了。
在看文档时发现了require-directory这个好东西,思路就是遍历循环router目录,呵呵,顺手拿来用
yarn add require-directory
app.js中的代码
const Router = require('koa-router');
const requireDirectory = require('require-directory')
requireDirectory(module, './routes', { visit: whenLoadModule });// routes
function whenLoadModule(obj) {
if (obj instanceof Router) {
app.use(obj.routes(), obj.allowedMethods());
}
}
四、log4js替换logger
发现默认的logger不适合
选用log4js ,可以按照日期区分日志
生产环境可以选用pm2 log日志(两者的区分配置后面再说)
下面具体说说log4js这东西
yarn add log4js
在config下增加对应的配置文件:config.log.js
新建中间件/app/middleware/log4.js
app.js中引入
const log4js = require('./app/middleware/log4');
具体代码见:
https://gitee.com/cuilanchao/koa-laboratory.git