在使用 koa 开发 nodejs 应用时,碰到跨域问题,即本地进行前端开发时,不能请求已经部署在某个域名下的接口。使用 koa-cors 和 koa2-cors 发现并没有效果。
也许是我用 koa 不多,感觉 koa 不是很好用很完备。比如没发指定当前的基础路径,需要文件结构配合,比如使用 koa-cors 或 koa2-cors 发现并没有解决跨域问题——没有设置上允许跨域的源,只能自己手写一个 cors 解决跨域的问题。
这里写一下 cors 函数的代码
const REG_WHITE_LIST = /^https?:\/\/(?:[0-9a-zA-Z-]+\.)*\.(?:ws|biz|com)(?::\d+)?$/;
// 这里写上想要匹配的域名
module.exports = async function cors (ctx, next) {
const origin = ctx.get('Origin');
if (origin && REG_WHITE_LIST.test(origin)) {
ctx.set('Access-Control-Allow-Origin', origin); // 允许跨域
ctx.set('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,HEAD,PUT,DELETE'); // 支持的方法
ctx.set('Access-Control-Allow-Credentials', 'true'); // 允许传入Cookie
ctx.set('Access-Control-Max-Age', 2592000); // 过期时间一个月
// 如果有特殊的请求头,直接响应
if (ctx.get('Access-Control-Request-Headers')) {
ctx.set('Access-Control-Allow-Headers', ctx.get('Access-Control-Request-Headers'));
}
// FIX:浏览器某些情况下没有带Origin头
ctx.set('Vary', 'Origin');
// 如果是 OPTIONS 请求,则直接返回
if (ctx.method === 'OPTIONS') {
ctx.status = 204;
return;
}
}
await next();
};
将上述 cors 函数直接在 koa 的实例里面使用。就可以跨域了。
const app = new Koa();
app.use(require("./cors.js"));
ps:受伤没有前端项目,想试一试自己写的跨域对不对怎么办?
这里给大家放上一段代码,直接在工作台的 console 的使用 XMLHttpRequest。
var httpRequest = new XMLHttpRequest();
httpRequest.open('GET', 'https://xxxx.com/api', true);
httpRequest.withCredentials =true; // 携带cookie信息
httpRequest.send();
执行之后,httpRequest.response
即可查看返回的信息。
详细内容看 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest
从上面的代码可以看出,不论是否跨域,服务都会接收到请求,并且能够访问请求的所有信息,而且服务器会去处理该请求,并返回相关信息。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于