Egg.js跨源部署Post的Connection Refused类型问题排查

353 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第4天

本次大项目中,我花费最多的时间是用来排查connection refuse与403 forbidden error这方面,因为我一直是本地部署,且基础不好,所以仅以此文章帮助其他新手排查connection refuse与403 forbidden错误。目前排查主要以先服务端,再前端为主

1. 调整Egg.js的安全设定--CSRF

Egg.js的本身安全策略设置较高,所以为了防止security有关的错误,我们将部分设置关闭;

config.security = {
    xframe:{
      enable:false,
    },
    csrf:{
        ignoreJSON:true,
    },
  };

2. 把post请求输入console,检查no-cors与403 forbidden设定,来允许非同源请求,然后再次尝试,可以即是可以,否则的话尝试其余项

const response = await fetch(url, {
    method: 'POST', // *GET, POST, PUT, DELETE, etc.
    mode: 'no-cors', // no-cors, *cors, same-origin
    cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
    credentials: 'same-origin', // include, *same-origin, omit
    headers: {
      'Content-Type': 'application/json'
      // 'Content-Type': 'application/x-www-form-urlencoded',
    },
    redirect: 'follow', // manual, *follow, error
    referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
    body: JSON.stringify({
      schema
    })

3. 如果报错持续,将Post请求修改为Get请求尝试,如果Get请求尝试未成功,尝试直接访问URL,看看是否会成功,如果仍不成功,检查第6项

如:

router.post('/api/schemas', controller.home.saveSchema);
router.get('/api/schemas',controller.home.saveSchema)

4. 其中,测试是否可以拿到return response,如果有return response则可以获取,如果没有显示则排查其余项

ctx.response.set('Access-Control-Allow-Origin','*');

5. 测试return值是否为空,下面为例子,其中schema为返回值,如果页面显示123则可以获取,如果页面没有显示则排查其余项

ctx.body = schema || 123; 

6. 最后排查,localhost与127.0.0.1是否同源,部分IPV6网址,为::1,其可能与127.0.0.1不同源,且访问ipv4的127.0.0.1会connection error;解决方法为修改hosts,或者先尝试修改获取内容的尝试中的url值

# const url = 'http://127.0.0.1:7001/api/schemas';    
const url = 'http://localhost:7001/api/schemas';    

如果经历了以上的排查,还是不能成功获取到post的话,或者现在仍然不同源获取connection error的话,恭喜你就已经到了我目前的状态