feat(core): Add optional Error-Output (#7460)

Add an additional optional error output to which all items get sent that
could not be processed.
![Screenshot from 2023-10-18
17-29-15](https://github.com/n8n-io/n8n/assets/6249596/e9732807-ab2b-4662-a5f6-bdff24f7ad55)

Github issue / Community forum post (link here to close automatically):
https://community.n8n.io/t/error-connector-for-nodes/3094

https://community.n8n.io/t/error-handling-at-node-level-detect-node-execution-status/26791

---------

Co-authored-by: OlegIvaniv <me@olegivaniv.com>
This commit is contained in:
Jan Oberhauser
2023-10-30 18:42:47 +01:00
committed by GitHub
parent 442c73e63b
commit 655efeaf66
20 changed files with 1090 additions and 61 deletions

View File

@@ -1045,21 +1045,48 @@ export function getNodeOutputs(
node: INode,
nodeTypeData: INodeTypeDescription,
): Array<ConnectionTypes | INodeOutputConfiguration> {
let outputs: Array<ConnectionTypes | INodeOutputConfiguration> = [];
if (Array.isArray(nodeTypeData.outputs)) {
return nodeTypeData.outputs;
outputs = nodeTypeData.outputs;
} else {
// Calculate the outputs dynamically
try {
outputs = (workflow.expression.getSimpleParameterValue(
node,
nodeTypeData.outputs,
'internal',
{},
) || []) as ConnectionTypes[];
} catch (e) {
throw new Error(`Could not calculate outputs dynamically for node "${node.name}"`);
}
}
// Calculate the outputs dynamically
try {
return (workflow.expression.getSimpleParameterValue(
node,
nodeTypeData.outputs,
'internal',
{},
) || []) as ConnectionTypes[];
} catch (e) {
throw new Error(`Could not calculate outputs dynamically for node "${node.name}"`);
if (node.onError === 'continueErrorOutput') {
// Copy the data to make sure that we do not change the data of the
// node type and so change the displayNames for all nodes in the flow
outputs = deepCopy(outputs);
if (outputs.length === 1) {
// Set the displayName to "Success"
if (typeof outputs[0] === 'string') {
outputs[0] = {
type: outputs[0],
};
}
outputs[0].displayName = 'Success';
}
return [
...outputs,
{
category: 'error',
type: 'main',
displayName: 'Error',
},
];
}
return outputs;
}
/**