
# 高频问题汇总
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
开发过程中，您有任何问题可以在github上[提交issue](https://github.com/huaweicloud/huaweicloud-sdk-browserjs-obs/issues)，或者在[华为云对象存储服务论坛](https://bbs.huaweicloud.com/forum/forum-620-1.html)中发帖求助。[接口参考文档](https://support.huaweicloud.com/api-obs_browserjs_sdk_api_zh/obs_34_0001.html)详细介绍了每个接口的参数和使用方法。
#### SignatureDoesNotMatch签名不匹配
```
Status-->403
Code-->SignatureDoesNotMatch
```
此错误一般是初始化ObsClient时传入的SK有误，解决方法：检查SK，确保正确。
#### MethodNotAllowed方法不允许
```
Status-->405
Code-->MethodNotAllowed
```
此错误一般是请求的OBS服务端未上线ObsClient接口依赖的特性，请联系OBS运维团队进行进一步确认。
#### 网络连接错误
```
Error: Network Error
```
此类错误一般有三种原因：
1. 初始化ObsClient时传入的Endpoint有误，解决方法：检查Endpoint，确保正确；
2. 客户端到OBS服务端的网络异常，导致无法访问，解决方法：检查客户端到OBS服务端的网络健康状况；
3. DNS解析出的OBS服务域名无法访问，解决方法：联系OBS运维团队；
4. SDK依赖底层库Axios的兼容性问题，解决方法：使用[浏览器表单上传](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0512.html)，或联系OBS运维团队。
#### 请求超时
```
timeout of xxx exceeded
```
此类错误一般有两种原因：
1. 客户端到OBS服务端的网络时延过大，解决方法：检查客户端到OBS服务端的网络健康状况；
2. 客户端到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](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0201.html)章节重新配置桶的CORS。
#### 请求成功但返回结果缺少某些字段
此类错误一般有两种原因：
1. 在桶的CORS配置中ExposeHeader配置不完整，例如未配置ETag（导致上传对象成功后无法获取ETag值）、未配置x-obs-request-id（导致请求完成后无法获取OBS服务端请求ID）等，解决方法：请参考[配置桶的CORS](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0201.html)章节重新配置桶的CORS；
2. 使用了旧版本的SDK，解决方法：升级到最新版本的SDK，可以从[这里](https://github.com/huaweicloud/huaweicloud-sdk-browserjs-obs/releases)下载最新版本。
 
#### IE浏览器集成SDK后加载报错
```
SCRIPT5009: 'Promise'未定义
```
此错误的原因是IE浏览器不支持Promise对象（ES6规范）导致，解决方法有三种：
1. 程序中使用**esdk-obs-browserjs-x.x.x.min.js** 作为SDK库文件，而不使用**esdk-obs-browserjs-without-polyfill-x.x.x.min.js**；
2. 对IE浏览器引入第三方库，补齐ES6规范，例如，引入**babel-polyfill**库；
3. 使用Chrome、Firefox等完成支持ES6规范的浏览器。
#### 无法获取上传后的ETag值
使用ObsClient.putObject和ObsClient.uploadPart上传文件成功后返回结果中无ETag值，此类错误一般有两种原因：
1. 桶的CORS配置中ExposeHeader不包含ETag头域，解决方法：按照文档[配置桶的CORS](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0201.html)为桶配置完整的CORS配置；
2. 桶的CORS配置中ExposeHeader包含ETag头域，但浏览器的返回结果屏蔽了ETag头域（一般发生在低版本的浏览器），解决方法：升级到高版本且完全支持HTML5的浏览器。
 
#### ObsClient未定义
```
Uncaught ReferenceError: ObsClient is not defined
```
此类错误一般有三种原因：
1. 程序中未能正确引入SDK，解决方法：排查程序引入SDK的方式，确认是否正确引入了**esdk-obs-browserjs-x.x.x.min.js** 或**esdk-obs-browserjs-without-polyfill-x.x.x.min.js**；
2. 程序中引入了AMD规范的模块化组件，例如require.js等，解决方法：使用[AMD规范创建ObsClient](https://support.huaweicloud.com/sdk-browserjs-devg-obs/obs_24_0203.html#obs_24_0203__section85601058205311)；
3. 程序中引入的组件与SDK的依赖库冲突（这种场景发生概率较小），解决方法：联系OBS运维团队。
 #### 不支持window.File的浏览器上传文件问题
```
Error: source file must be an instance of window.File or window.Blob
```
此错误的原因是SDK依赖H5标准提供的window.File实现文件上传，如果使用不支持window.File的浏览器，例如IE8、IE9等，则无法使用ObsClient.putObject和ObsClient.uploadFile上传文件，解决方法：基于表单实现文件上传，具体步骤如下。
1. 判断浏览器是否支持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;
   ```
   
   
2. 根据步骤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) {
      // 处理回调函数
   });
   ```
   
   
![](https://support.huaweicloud.com/sdk-browserjs-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
基于表单上传的文件最大不能超过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打桩导致，解决方法有两种：
1. 规避：使用SDK进行上传、下载、断点续传上传时不启用进度条功能；
2. 替换：替换Mock.js组件，使用能够全部模拟XHR接口的组件；
3. 扩展：扩展Mock.js组件，补齐Mock.js对XHR不支持的接口。
 
