情景:node运用koa库,发起后端服务;前端axios发起post请求,传送json数据。
坑:axios默认的content-type是application/json;utf-8
。如此一来,直接变成了cors的复杂请求。
如果只是简单请求,koa-router可以进行如下设置:
router.post('/login',()=>{
ctx.set("Access-Control-Allow-Origin", "http://localhost:3000")
ctx.set("Access-Control-Allow-Credentials",true)
}
客户端和服务端是可以正常交互的。
为了解决axios默认content-type为content-type所产生的复杂请求,有2个解决思路:
1、将axios的content-type设置为简单请求的格式application/x-www-form-urlencoded、multipart/form-data 或 text/plain
代码如下
http({
url:'/login',
method:'post',
data:{
user:user,
pwd:pwd
},
headers:{
'Content-type': 'application/x-www-form-urlencoded'
//或其他格式
}
})
2、在服务器端允许application/json的复杂请求
利用koa库时,可以增加koa-cors的引用,可直接解决跨域问题。代码如下
const Koa = require('koa');
const Router = require('koa-router');
const koaBody = require('koa-body');
const cors = require('koa-cors')
const login = require('./libs/login');
const app = new Koa();
const router = new Router;
app.use(koaBody());
app.use(cors()); //增加这个应用
router.post('/login',login)
app.use(router.routes());
app.listen(8080);
另,经尝试,如下方法没用。。。。。
(ctx) => {
ctx.set("Access-Control-Allow-Origin", "http://localhost:3000")
ctx.set("Access-Control-Allow-Credentials",true)
// 如果引用了koa-cors,上面两行也不用设置
// 涉及到复杂请求的时候,下面这些设置无效,需要另外引用koa-cors;
// ctx.set('Access-Control-Allow-Methods','OPTIONS,POST')
// ctx.set('Access-Control-Allow-Headers','Content-Type')
// ctx.set('content-type',"application/json; charset=utf-8")
// ctx.type = 'application/json; charset=utf-8';
console.log('接收到了前端的请求',ctx.request.body);
ctx.body="接收到了后台的数据"
}