From f9af5e71d65901b596288a0e876bc8d2ca54044e Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Wed, 6 Nov 2019 21:11:16 +0100 Subject: [PATCH] Improve expression evaluation (#133) * Add test case for object-to-string target type * Add exception handling --- .../Expressions/WorkflowExpressionEvaluator.cs | 16 ++++++++++++++-- .../Services/JavaScriptExpressionEvaluator.cs | 4 ++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/core/Elsa.Core/Expressions/WorkflowExpressionEvaluator.cs b/src/core/Elsa.Core/Expressions/WorkflowExpressionEvaluator.cs index 78d8af460..8fe25d8a1 100644 --- a/src/core/Elsa.Core/Expressions/WorkflowExpressionEvaluator.cs +++ b/src/core/Elsa.Core/Expressions/WorkflowExpressionEvaluator.cs @@ -5,16 +5,19 @@ using System.Threading; using System.Threading.Tasks; using Elsa.Services; using Elsa.Services.Models; +using Microsoft.Extensions.Logging; namespace Elsa.Expressions { public class WorkflowExpressionEvaluator : IWorkflowExpressionEvaluator { private readonly IDictionary evaluators; + private readonly ILogger logger; - public WorkflowExpressionEvaluator(IEnumerable evaluators) + public WorkflowExpressionEvaluator(IEnumerable evaluators, ILogger logger) { this.evaluators = evaluators.ToDictionary(x => x.Syntax); + this.logger = logger; } public async Task EvaluateAsync(IWorkflowExpression expression, Type type, WorkflowExecutionContext workflowExecutionContext, CancellationToken cancellationToken) @@ -23,7 +26,16 @@ namespace Elsa.Expressions return default; var evaluator = evaluators[expression.Syntax]; - return await evaluator.EvaluateAsync(expression.Expression, type, workflowExecutionContext, cancellationToken); + + try + { + return await evaluator.EvaluateAsync(expression.Expression, type, workflowExecutionContext, cancellationToken); + } + catch (Exception e) + { + logger.LogError(e, "Error while evaluating {Expression}.", expression); + return $"Error while evaluating {expression.Syntax} expression \"{expression.Expression}\". Message: {e.Message}"; + } } } } \ No newline at end of file diff --git a/src/scripting/Elsa.Scripting.JavaScript/Services/JavaScriptExpressionEvaluator.cs b/src/scripting/Elsa.Scripting.JavaScript/Services/JavaScriptExpressionEvaluator.cs index 8eec73e5c..055815f13 100644 --- a/src/scripting/Elsa.Scripting.JavaScript/Services/JavaScriptExpressionEvaluator.cs +++ b/src/scripting/Elsa.Scripting.JavaScript/Services/JavaScriptExpressionEvaluator.cs @@ -110,6 +110,10 @@ namespace Elsa.Scripting.JavaScript.Services { var obj = value.AsObject().ToObject(); var type = targetType ?? obj.GetType(); + + if (type == typeof(string)) + return Convert.ToString(obj); + var json = JsonConvert.SerializeObject(obj, serializerSettings); return JsonConvert.DeserializeObject(json, type, serializerSettings); }