diff --git a/packages/nodes-base/nodes/Redis/Redis.node.ts b/packages/nodes-base/nodes/Redis/Redis.node.ts index 72f952f73e..abefcf17b7 100644 --- a/packages/nodes-base/nodes/Redis/Redis.node.ts +++ b/packages/nodes-base/nodes/Redis/Redis.node.ts @@ -349,7 +349,18 @@ export class Redis implements INodeType { default: 'automatic', description: 'The type of the key to set', }, - + { + displayName: 'Value Is JSON', + name: 'valueIsJSON', + type: 'boolean', + displayOptions: { + show: { + keyType: ['hash'], + }, + }, + default: true, + description: 'Whether the value is JSON or key value pairs', + }, { displayName: 'Expire', name: 'expire', @@ -605,6 +616,7 @@ export class Redis implements INodeType { expire: boolean, ttl: number, type?: string, + valueIsJSON?: boolean, ) => { if (type === undefined || type === 'automatic') { // Request the type first @@ -627,9 +639,26 @@ export class Redis implements INodeType { await clientSet(keyName, value.toString()); } else if (type === 'hash') { const clientHset = util.promisify(client.hset).bind(client); - for (const key of Object.keys(value)) { - // @ts-ignore - await clientHset(keyName, key, (value as IDataObject)[key]!.toString()); + if (valueIsJSON) { + let values: unknown; + if (typeof value === 'string') { + try { + values = JSON.parse(value); + } catch { + // This is how we originally worked and prevents a breaking change + values = value; + } + } else { + values = value; + } + for (const key of Object.keys(values as object)) { + // @ts-ignore + await clientHset(keyName, key, (values as IDataObject)[key]!.toString()); + } + } else { + const values = value.toString().split(' '); + //@ts-ignore + await clientHset(keyName, values); } } else if (type === 'list') { const clientLset = util.promisify(client.lset).bind(client); @@ -742,10 +771,15 @@ export class Redis implements INodeType { const keySet = this.getNodeParameter('key', itemIndex) as string; const value = this.getNodeParameter('value', itemIndex) as string; const keyType = this.getNodeParameter('keyType', itemIndex) as string; + const valueIsJSON = this.getNodeParameter( + 'valueIsJSON', + itemIndex, + true, + ) as boolean; const expire = this.getNodeParameter('expire', itemIndex, false) as boolean; const ttl = this.getNodeParameter('ttl', itemIndex, -1) as number; - await setValue(client, keySet, value, expire, ttl, keyType); + await setValue(client, keySet, value, expire, ttl, keyType, valueIsJSON); returnItems.push(items[itemIndex]); } else if (operation === 'incr') { const keyIncr = this.getNodeParameter('key', itemIndex) as string;