mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-17 10:02:05 +00:00
🐛 Fix issue that expressions always read from output with index 0 even
when the nodes with the expression were connected to a different one
This commit is contained in:
@@ -456,9 +456,7 @@ export class Workflow {
|
||||
return currentHighest;
|
||||
}
|
||||
|
||||
if (checkedNodes === undefined) {
|
||||
checkedNodes = [];
|
||||
}
|
||||
checkedNodes = checkedNodes || [];
|
||||
|
||||
if (checkedNodes!.includes(nodeName)) {
|
||||
// Node got checked already before
|
||||
@@ -537,9 +535,7 @@ export class Workflow {
|
||||
return [];
|
||||
}
|
||||
|
||||
if (checkedNodes === undefined) {
|
||||
checkedNodes = [];
|
||||
}
|
||||
checkedNodes = checkedNodes || [];
|
||||
|
||||
if (checkedNodes!.includes(nodeName)) {
|
||||
// Node got checked already before
|
||||
@@ -587,6 +583,70 @@ export class Workflow {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Returns via which output of the parent-node the node
|
||||
* is connected to.
|
||||
*
|
||||
* @param {string} nodeName The node to check how it is connected with parent node
|
||||
* @param {string} parentNodeName The parent node to get the output index of
|
||||
* @param {string} [type='main']
|
||||
* @param {*} [depth=-1]
|
||||
* @param {string[]} [checkedNodes]
|
||||
* @returns {(number | undefined)}
|
||||
* @memberof Workflow
|
||||
*/
|
||||
getNodeConnectionOutputIndex(nodeName: string, parentNodeName: string, type = 'main', depth = -1, checkedNodes?: string[]): number | undefined {
|
||||
depth = depth === -1 ? -1 : depth;
|
||||
const newDepth = depth === -1 ? depth : depth - 1;
|
||||
if (depth === 0) {
|
||||
// Reached max depth
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (!this.connectionsByDestinationNode.hasOwnProperty(nodeName)) {
|
||||
// Node does not have incoming connections
|
||||
return undefined;
|
||||
}
|
||||
|
||||
if (!this.connectionsByDestinationNode[nodeName].hasOwnProperty(type)) {
|
||||
// Node does not have incoming connections of given type
|
||||
return undefined;
|
||||
}
|
||||
|
||||
checkedNodes = checkedNodes || [];
|
||||
|
||||
if (checkedNodes!.includes(nodeName)) {
|
||||
// Node got checked already before
|
||||
return undefined;
|
||||
}
|
||||
|
||||
checkedNodes!.push(nodeName);
|
||||
|
||||
let outputIndex: number | undefined;
|
||||
for (const connectionsByIndex of this.connectionsByDestinationNode[nodeName][type]) {
|
||||
for (const connection of connectionsByIndex) {
|
||||
if (parentNodeName === connection.node) {
|
||||
return connection.index;
|
||||
}
|
||||
|
||||
if (checkedNodes!.includes(connection.node)) {
|
||||
// Node got checked already before
|
||||
return;
|
||||
}
|
||||
|
||||
outputIndex = this.getNodeConnectionOutputIndex(connection.node, parentNodeName, type, newDepth, checkedNodes);
|
||||
|
||||
if (outputIndex !== undefined) {
|
||||
return outputIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Resolves parameter value of parameter in webhook description
|
||||
*
|
||||
|
||||
@@ -150,9 +150,20 @@ export class WorkflowDataProxy {
|
||||
throw new Error(`No data found from "main" input.`);
|
||||
}
|
||||
|
||||
// Currently it is only possible to reference data from the first input
|
||||
// so we hardcode it.
|
||||
executionData = taskData.main[0] as INodeExecutionData[];
|
||||
// Check from which output to read the data.
|
||||
// Depends on how the nodes are connected.
|
||||
// (example "IF" node. If node is connected to "true" or to "false" output)
|
||||
const outputIndex = that.workflow.getNodeConnectionOutputIndex(that.activeNodeName, nodeName, 'main');
|
||||
|
||||
if (outputIndex === undefined) {
|
||||
throw new Error(`The node "${that.activeNodeName}" is not connected with node "${nodeName}" so no data can get returned from it.`);
|
||||
}
|
||||
|
||||
if (taskData.main.length < outputIndex) {
|
||||
throw new Error(`No data found from "main" input with index "${outputIndex}" via which node is connected with.`);
|
||||
}
|
||||
|
||||
executionData = taskData.main[outputIndex] as INodeExecutionData[];
|
||||
} else {
|
||||
// Short syntax got used to return data from active node
|
||||
|
||||
|
||||
Reference in New Issue
Block a user