{"record":{"id":"2eb38f20ddc434a7","repo":"FlowiseAI/Flowise","slug":"invalid-json-in-the-additional-configuration-ex","errorCode":null,"errorMessage":"Invalid JSON in the Additional Configuration: ${exception}","messagePattern":"Invalid JSON in the Additional Configuration: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/components/nodes/recordmanager/MySQLRecordManager/MySQLrecordManager.ts","lineNumber":137,"sourceCode":"    async init(nodeData: INodeData, _: string, options: ICommonObject): Promise<any> {\n        const credentialData = await getCredentialData(nodeData.credential ?? '', options)\n        const user = getCredentialParam('user', credentialData, nodeData)\n        const password = getCredentialParam('password', credentialData, nodeData)\n        const _tableName = nodeData.inputs?.tableName as string\n        const tableName = _tableName ? _tableName : 'upsertion_records'\n        const additionalConfig = nodeData.inputs?.additionalConfig as string\n        const _namespace = nodeData.inputs?.namespace as string\n        const namespace = _namespace ? _namespace : options.chatflowid\n        const cleanup = nodeData.inputs?.cleanup as string\n        const _sourceIdKey = nodeData.inputs?.sourceIdKey as string\n        const sourceIdKey = _sourceIdKey ? _sourceIdKey : 'source'\n\n        let additionalConfiguration = {}\n        if (additionalConfig) {\n            try {\n                additionalConfiguration = typeof additionalConfig === 'object' ? additionalConfig : JSON.parse(additionalConfig)\n            } catch (exception) {\n                throw new Error('Invalid JSON in the Additional Configuration: ' + exception)\n            }\n            additionalConfiguration = sanitizeDataSourceOptions(additionalConfiguration)\n        }\n\n        const mysqlOptions = {\n            ...additionalConfiguration,\n            type: 'mysql',\n            host: nodeData.inputs?.host as string,\n            port: nodeData.inputs?.port as number,\n            username: user,\n            password: password,\n            database: nodeData.inputs?.database as string\n        }\n\n        const args = {\n            mysqlOptions,\n            tableName: tableName\n        }","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/FlowiseAI/Flowise/blob/abe4a8601a058047b350c260676826e21dd14101/packages/components/nodes/recordmanager/MySQLRecordManager/MySQLrecordManager.ts#L119-L155","documentation":"MySQLRecordManager.init parses `nodeData.inputs?.additionalConfig` as JSON when it is a string. The parsed object is then passed through `sanitizeDataSourceOptions` and merged into mysql connection options. Invalid JSON throws inside the try and is rethrown with this message.","triggerScenarios":"additionalConfig field holds malformed JSON; user pastes a TypeORM config snippet using JS syntax (e.g. unquoted keys, single quotes, functions); config contains comments.","commonSituations":"Adding SSL/TLS or pool options to the MySQL record manager; pasting config from a TypeORM docs example written as a JS object; mixing in environment variable substitutions that break JSON.","solutions":["Provide additionalConfig as valid JSON: `{\"ssl\":{\"rejectUnauthorized\":true},\"poolSize\":10}`.","Remove JS-only constructs (comments, functions, undefined) — use strings/numbers/booleans/null only.","Run sanitizeDataSourceOptions-friendly keys only (avoid keys the sanitizer will strip).","If the config is large, build it in a prior node as an object and pass it through to skip parsing."],"exampleFix":"// before\nadditionalConfiguration = typeof additionalConfig === 'object' ? additionalConfig : JSON.parse(additionalConfig)\n// after\nif (typeof additionalConfig === 'string') {\n  try { additionalConfiguration = JSON.parse(additionalConfig) }\n  catch (e) { throw new Error(`MySQL additionalConfig invalid JSON: ${(e as Error).message}. Got: ${additionalConfig.slice(0,160)}`) }\n} else additionalConfiguration = additionalConfig","handlingStrategy":"validation","validationCode":"function parseAdditionalConfig(input: unknown): ICommonObject {\n  if (input == null) return {}\n  if (typeof input === 'object') return input as ICommonObject\n  try { return JSON.parse(input) }\n  catch (e) { throw new Error(`MySQL additionalConfig invalid JSON: ${(e as Error).message}`) }\n}","typeGuard":"const isPlainObject = (v: unknown): v is Record<string, unknown> => typeof v === 'object' && v !== null && !Array.isArray(v)","tryCatchPattern":null,"preventionTips":["Use JSON (no JS comments/functions) for TypeORM options.","Pass config objects from upstream nodes when large.","Check sanitizeDataSourceOptions's allowed keys before submitting."],"tags":["json","validation","mysql","record-manager","database","configuration"],"backgroundTag":null,"analyzedSha":"abe4a8601a058047b350c260676826e21dd14101","analyzedAt":"2026-08-12T16:04:40.823Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}