高频问题汇总
开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。
SignatureDoesNotMatch签名不匹配
Status-->403 Code-->SignatureDoesNotMatch
此错误一般是初始化ObsClient时传入的SK有误,解决方法:检查SK,确保正确。
MethodNotAllowed方法不允许
Status-->405 Code-->MethodNotAllowed
此错误一般是请求的OBS服务端未上线ObsClient接口依赖的特性,请联系OBS运维团队进行进一步确认。
网络连接错误
Error: Network Error
此类错误一般有三种原因:
- 初始化ObsClient时传入的Endpoint有误,解决方法:检查Endpoint,确保正确;
- 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况;
- DNS解析出的OBS服务域名无法访问,解决方法:联系OBS运维团队;
- SDK依赖底层库Axios的兼容性问题,解决方法:使用浏览器表单上传,或联系OBS运维团队。
请求超时
timeout of xxx exceeded
此类错误一般有两种原因:
- 客户端到OBS服务端的网络时延过大,解决方法:检查客户端到OBS服务端的网络健康状况;
- 客户端到OBS服务端的网络异常,导致无法访问,解决方法:检查客户端到OBS服务端的网络健康状况。
跨域请求被拦截
Access to XMLHttpRequest at 'xxx' from origin 'xxx' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
此错误均是由于未配置桶的CORS或配置的CORS有误导致,解决方法:请参考配置桶的CORS章节重新配置桶的CORS。
请求成功但返回结果缺少某些字段
此类错误一般有两种原因:
IE浏览器集成SDK后加载报错
SCRIPT5009: 'Promise'未定义
此错误的原因是IE浏览器不支持Promise对象(ES6规范)导致,解决方法有三种:
- 程序中使用esdk-obs-browserjs-x.x.x.min.js作为SDK库文件,而不使用esdk-obs-browserjs-without-polyfill-x.x.x.min.js;
- 对IE浏览器引入第三方库,补齐ES6规范,例如,引入babel-polyfill库;
- 使用Chrome、Firefox等完成支持ES6规范的浏览器。
无法获取上传后的ETag值
使用ObsClient.putObject和ObsClient.uploadPart上传文件成功后返回结果中无ETag值,此类错误一般有两种原因:
- 桶的CORS配置中ExposeHeader不包含ETag头域,解决方法:按照文档配置桶的CORS为桶配置完整的CORS配置;
- 桶的CORS配置中ExposeHeader包含ETag头域,但浏览器的返回结果屏蔽了ETag头域(一般发生在低版本的浏览器),解决方法:升级到高版本且完全支持HTML5的浏览器。
ObsClient未定义
Uncaught ReferenceError: ObsClient is not defined
此类错误一般有三种原因:
- 程序中未能正确引入SDK,解决方法:排查程序引入SDK的方式,确认是否正确引入了esdk-obs-browserjs-x.x.x.min.js或esdk-obs-browserjs-without-polyfill-x.x.x.min.js;
- 程序中引入了AMD规范的模块化组件,例如require.js等,解决方法:使用AMD规范创建ObsClient;
- 程序中引入的组件与SDK的依赖库冲突(这种场景发生概率较小),解决方法:联系OBS运维团队。
此错误的原因是SDK依赖H5标准提供的window.File实现文件上传,如果使用不支持window.File的浏览器,例如IE8、IE9等,则无法使用ObsClient.putObject和ObsClient.uploadFile上传文件,解决方法:基于表单实现文件上传,具体步骤如下。
- 判断浏览器是否支持window.File,示例代码如下:
function getBrowserInfo() { var agent = navigator.userAgent.toLowerCase(); var regStr_ie = /msie [\d.]+;/gi; var regStr_ff = /firefox\/[\d.]+/gi var regStr_chrome = /chrome\/[\d.]+/gi; var regStr_saf = /safari\/[\d.]+/gi; var isIE = agent.indexOf('compatible') > -1 && agent.indexOf('msie' > -1); var isEdge = agent.indexOf('edge') > -1 && !isIE; var isIE11 = agent.indexOf('trident') > -1 && agent.indexOf('rv:11.0') > -1; if (isIE) { var reIE = new RegExp('msie (\\d+\\.\\d+);'); reIE.test(agent); var fIEVersion = parseFloat(RegExp['$1']); if (fIEVersion == 7) { return 'IE/7'; } else if (fIEVersion == 8) { return 'IE/8'; } else if (fIEVersion == 9) { return 'IE/9'; } else if (fIEVersion == 10) { return 'IE/10'; } } // isIE end if (isIE11) { return 'IE/11'; } // Firefox if (agent.indexOf('firefox') > 0) { return agent.match(regStr_ff); } // Safari if (agent.indexOf('safari') > 0 && agent.indexOf('chrome') < 0) { return agent.match(regStr_saf); } // Chrome if (agent.indexOf('chrome') > 0) { return agent.match(regStr_chrome); } return ''; } var browserInfo = getBrowserInfo(); // 判断浏览器是否支持window.File var isSupportFileApi = browserInfo !== 'IE/7' && browserInfo !== 'IE/8' && browserInfo !== 'IE/9' && window.File;
- 根据步骤1的判断结果,选择合适的上传方式,示例代码如下:
function postObject(){ // 使用JS代码提交表单,实现表单上传。 } if(isSupportFileApi){ // 使用表单上传文件 return postObject(); } // 创建ObsClient实例 var obsClient = new ObsClient({ // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量AccessKeyID和SecretAccessKey。 // 前端本身没有process对象,可以使用webpack类打包工具定义环境变量,就可以在代码中运行了。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html access_key_id: process.env.AccessKeyID, secret_access_key: process.env.SecretAccessKey, // 这里以华北-北京四为例,其他地区请按实际情况填写 server: 'https://obs.cn-north-4.myhuaweicloud.com' }); // 使用SDK的断点续传接口上传文件 obsClient.uploadFile({ // 传入请求参数 }, function (err, result) { // 处理回调函数 });
基于表单上传的文件最大不能超过5GB。
引入CommonJS规范导致未定义
Uncaught (in promise) TypeError: Cannot read property 'CancelToken' of undefined
此错误的原因是程序中引入了CommonJS规范的模块化组件,例如webpack等,解决方法:升级到3.19.5及以上版本SDK。
引入Mock.js导致未定义
Uncaught TypeError: request.upload.addEventListener in not a function
此错误的原因是程序中引入了Mock.js组件对XHR打桩导致,解决方法有两种:
- 规避:使用SDK进行上传、下载、断点续传上传时不启用进度条功能;
- 替换:替换Mock.js组件,使用能够全部模拟XHR接口的组件;
- 扩展:扩展Mock.js组件,补齐Mock.js对XHR不支持的接口。