浏览代码

@uppy/transloadit: improve fetch error handling (#3637)

Returning a non-2xx code is not a `NetworkError`, it's a rejection from
the server and we should handle it as such.
Antoine du Hamel 3 年之前
父节点
当前提交
dceac85af5
共有 1 个文件被更改,包括 24 次插入16 次删除
  1. 24 16
      packages/@uppy/transloadit/src/Client.js

+ 24 - 16
packages/@uppy/transloadit/src/Client.js

@@ -1,5 +1,6 @@
 const fetchWithNetworkError = require('@uppy/utils/lib/fetchWithNetworkError')
 const fetchWithNetworkError = require('@uppy/utils/lib/fetchWithNetworkError')
-const NetworkError = require('@uppy/utils/lib/NetworkError')
+
+const ASSEMBLIES_ENDPOINT = '/assemblies'
 
 
 function fetchJSON (...args) {
 function fetchJSON (...args) {
   return fetchWithNetworkError(...args).then(response => {
   return fetchWithNetworkError(...args).then(response => {
@@ -12,7 +13,27 @@ function fetchJSON (...args) {
     }
     }
 
 
     if (!response.ok) {
     if (!response.ok) {
-      return Promise.reject(new NetworkError(response.statusText))
+      const serverError = new Error(response.statusText)
+      serverError.statusCode = response.status
+
+      if (!`${args[0]}`.endsWith(ASSEMBLIES_ENDPOINT)) return Promise.reject(serverError)
+
+      // Failed assembly requests should return a more detailed error in JSON.
+      return response.json().then(assembly => {
+        if (!assembly.error) throw serverError
+
+        const error = new Error(assembly.error)
+        error.details = assembly.message
+        error.assembly = assembly
+        if (assembly.assembly_id) {
+          error.details += ` Assembly ID: ${assembly.assembly_id}`
+        }
+        throw error
+      }, err => {
+        // eslint-disable-next-line no-param-reassign
+        err.cause = serverError
+        throw err
+      })
     }
     }
 
 
     return response.json()
     return response.json()
@@ -61,25 +82,12 @@ module.exports = class Client {
     })
     })
     data.append('num_expected_upload_files', expectedFiles)
     data.append('num_expected_upload_files', expectedFiles)
 
 
-    const url = new URL('/assemblies', `${this.opts.service}`).href
+    const url = new URL(ASSEMBLIES_ENDPOINT, `${this.opts.service}`).href
     return fetchJSON(url, {
     return fetchJSON(url, {
       method: 'post',
       method: 'post',
       headers: this.#headers,
       headers: this.#headers,
       body: data,
       body: data,
     })
     })
-      .then((assembly) => {
-        if (assembly.error) {
-          const error = new Error(assembly.error)
-          error.details = assembly.message
-          error.assembly = assembly
-          if (assembly.assembly_id) {
-            error.details += ` Assembly ID: ${assembly.assembly_id}`
-          }
-          throw error
-        }
-
-        return assembly
-      })
       .catch((err) => this.#reportError(err, { url, type: 'API_ERROR' }))
       .catch((err) => this.#reportError(err, { url, type: 'API_ERROR' }))
   }
   }