mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 01:56:46 +00:00
fix: Fix resolving of expressions of deeply nested sub-nodes (#8612)
This commit is contained in:
@@ -43,8 +43,9 @@ import type {
|
||||
NodeParameterValueType,
|
||||
ConnectionTypes,
|
||||
CloseFunction,
|
||||
INodeOutputConfiguration,
|
||||
} from './Interfaces';
|
||||
import { Node } from './Interfaces';
|
||||
import { Node, NodeConnectionType } from './Interfaces';
|
||||
import type { IDeferredPromise } from './DeferredPromise';
|
||||
|
||||
import * as NodeHelpers from './NodeHelpers';
|
||||
@@ -845,6 +846,47 @@ export class Workflow {
|
||||
return returnConns;
|
||||
}
|
||||
|
||||
getParentMainInputNode(node: INode): INode {
|
||||
if (node) {
|
||||
const nodeType = this.nodeTypes.getByNameAndVersion(node.type, node.typeVersion);
|
||||
const outputs = NodeHelpers.getNodeOutputs(this, node, nodeType.description);
|
||||
|
||||
if (
|
||||
!!outputs.find(
|
||||
(output) =>
|
||||
((output as INodeOutputConfiguration)?.type ?? output) !== NodeConnectionType.Main,
|
||||
)
|
||||
) {
|
||||
// Get the first node which is connected to a non-main output
|
||||
const nonMainNodesConnected = outputs?.reduce((acc, outputName) => {
|
||||
const parentNodes = this.getChildNodes(
|
||||
node.name,
|
||||
(outputName as INodeOutputConfiguration)?.type ?? outputName,
|
||||
);
|
||||
if (parentNodes.length > 0) {
|
||||
acc.push(...parentNodes);
|
||||
}
|
||||
return acc;
|
||||
}, [] as string[]);
|
||||
|
||||
if (nonMainNodesConnected.length) {
|
||||
const returnNode = this.getNode(nonMainNodesConnected[0]);
|
||||
if (returnNode === null) {
|
||||
// This should theoretically never happen as the node is connected
|
||||
// but who knows and it makes TS happy
|
||||
throw new ApplicationError(`Node "${nonMainNodesConnected[0]}" not found`);
|
||||
}
|
||||
|
||||
// The chain of non-main nodes is potentially not finished yet so
|
||||
// keep on going
|
||||
return this.getParentMainInputNode(returnNode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns via which output of the parent-node and index the current node
|
||||
* they are connected
|
||||
|
||||
@@ -993,7 +993,13 @@ export class WorkflowDataProxy {
|
||||
|
||||
// Before resolving the pairedItem make sure that the requested node comes in the
|
||||
// graph before the current one
|
||||
const parentNodes = that.workflow.getParentNodes(that.contextNodeName);
|
||||
const activeNode = that.workflow.getNode(that.activeNodeName);
|
||||
let contextNode = that.contextNodeName;
|
||||
if (activeNode) {
|
||||
const parentMainInputNode = that.workflow.getParentMainInputNode(activeNode);
|
||||
contextNode = parentMainInputNode.name ?? contextNode;
|
||||
}
|
||||
const parentNodes = that.workflow.getParentNodes(contextNode);
|
||||
if (!parentNodes.includes(nodeName)) {
|
||||
throw createExpressionError('Invalid expression', {
|
||||
messageTemplate: 'Invalid expression under ‘%%PARAMETER%%’',
|
||||
|
||||
Reference in New Issue
Block a user