Browse Source

fix(core): Gracefully handle errors in creating asset previews

Fixes #1246
Michael Bromley 4 years ago
parent
commit
c3cfcb3c3d
1 changed files with 11 additions and 10 deletions
  1. 11 10
      packages/core/src/service/services/asset.service.ts

+ 11 - 10
packages/core/src/service/services/asset.service.ts

@@ -15,8 +15,8 @@ import { omit } from '@vendure/common/lib/omit';
 import { ID, PaginatedList, Type } from '@vendure/common/lib/shared-types';
 import { ID, PaginatedList, Type } from '@vendure/common/lib/shared-types';
 import { notNullOrUndefined } from '@vendure/common/lib/shared-utils';
 import { notNullOrUndefined } from '@vendure/common/lib/shared-utils';
 import { unique } from '@vendure/common/lib/unique';
 import { unique } from '@vendure/common/lib/unique';
-import { ReadStream } from 'fs-extra';
 import { ReadStream as FSReadStream } from 'fs';
 import { ReadStream as FSReadStream } from 'fs';
+import { ReadStream } from 'fs-extra';
 import mime from 'mime-types';
 import mime from 'mime-types';
 import path from 'path';
 import path from 'path';
 import { Readable, Stream } from 'stream';
 import { Readable, Stream } from 'stream';
@@ -250,13 +250,13 @@ export class AssetService {
             stream.on('error', (err: any) => {
             stream.on('error', (err: any) => {
                 reject(err);
                 reject(err);
             });
             });
-            const result = await this.createAssetInternal(
-                ctx,
-                stream,
-                filename,
-                mimetype,
-                input.customFields,
-            );
+            let result: Asset | MimeTypeError;
+            try {
+                result = await this.createAssetInternal(ctx, stream, filename, mimetype, input.customFields);
+            } catch (e) {
+                reject(e);
+                return;
+            }
             if (isGraphQlErrorResult(result)) {
             if (isGraphQlErrorResult(result)) {
                 resolve(result);
                 resolve(result);
                 return;
                 return;
@@ -394,7 +394,8 @@ export class AssetService {
         stream: ReadStream | Readable,
         stream: ReadStream | Readable,
         maybeFilePath?: string,
         maybeFilePath?: string,
     ): Promise<CreateAssetResult> {
     ): Promise<CreateAssetResult> {
-        const filePath = stream instanceof ReadStream || stream instanceof FSReadStream ? stream.path : maybeFilePath;
+        const filePath =
+            stream instanceof ReadStream || stream instanceof FSReadStream ? stream.path : maybeFilePath;
         if (typeof filePath === 'string') {
         if (typeof filePath === 'string') {
             const filename = path.basename(filePath);
             const filename = path.basename(filePath);
             const mimetype = mime.lookup(filename) || 'application/octet-stream';
             const mimetype = mime.lookup(filename) || 'application/octet-stream';
@@ -460,7 +461,7 @@ export class AssetService {
         try {
         try {
             preview = await assetPreviewStrategy.generatePreviewImage(ctx, mimetype, sourceFile);
             preview = await assetPreviewStrategy.generatePreviewImage(ctx, mimetype, sourceFile);
         } catch (e) {
         } catch (e) {
-            Logger.error(`Could not create Asset preview image: ${e.message}`);
+            Logger.error(`Could not create Asset preview image: ${e.message}`, undefined, e.stack);
             throw e;
             throw e;
         }
         }
         const previewFileIdentifier = await assetStorageStrategy.writeFileFromBuffer(
         const previewFileIdentifier = await assetStorageStrategy.writeFileFromBuffer(