{"record":{"id":"555bee0ac3fd31a2","repo":"siyuan-note/siyuan","slug":"unsupported-block-data-type-s","errorCode":null,"errorMessage":"unsupported block data type [%s]","messagePattern":"unsupported block data type \\[(.+?)\\]","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/block_update.go","lineNumber":214,"sourceCode":"\t}\n\tif \"\" != invalidID {\n\t\treturn \"\", errors.New(\"found invalid ID [\" + invalidID + \"]\")\n\t}\n\treturn\n}\n\nfunc parseBlockUpdateData(data, dataType string, luteEngine *lute.Lute) (ret string, tree *parse.Tree, err error) {\n\tret = data\n\tswitch dataType {\n\tcase \"markdown\":\n\t\tret, err = DataBlockDOM(data, luteEngine)\n\t\tif err != nil {\n\t\t\terr = fmt.Errorf(\"data block DOM failed: %w\", err)\n\t\t\treturn\n\t\t}\n\tcase \"dom\":\n\tdefault:\n\t\terr = fmt.Errorf(\"unsupported block data type [%s]\", dataType)\n\t\treturn\n\t}\n\n\ttree = luteEngine.BlockDOM2Tree(ret)\n\tif nil == tree || nil == tree.Root || nil == firstContentBlock(tree.Root) {\n\t\terr = errors.New(\"parse tree failed\")\n\t}\n\treturn\n}\n\nfunc normalizeBlockUpdateTree(oldNode *ast.Node, tree *parse.Tree, luteEngine *lute.Lute) (ret *parse.Tree, updatedNode *ast.Node, err error) {\n\tupdatedNode, err = resolveBlockUpdateNode(oldNode, tree.Root)\n\tif err != nil {\n\t\treturn nil, nil, err\n\t}\n\n\tupdatedNode.Unlink()\n\troot := &ast.Node{Type: ast.NodeDocument}","sourceCodeStart":196,"sourceCodeEnd":232,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/9f775e8a12daef8255556097396f9b2739078892/kernel/model/block_update.go#L196-L232","documentation":"parseBlockUpdateData only accepts dataType \"markdown\" or \"dom\" for block update payloads. Any other dataType value hits the default branch and returns this error naming the unsupported type. It is an input-validation guard on the block update API.","triggerScenarios":"Calling buildBlockUpdateOperations (via /api/block/updateBlock) with a dataType other than \"markdown\" or \"dom\" — e.g. \"md\", \"text\", \"html\", or an empty string.","commonSituations":"Typos in API integrations; clients reusing dataType values from other SiYuan endpoints (such as \"markdown\" vs \"dom\" confusion); copy-pasted code from older API examples using different type names.","solutions":["Set dataType to exactly \"markdown\" when sending Markdown content","Set dataType to exactly \"dom\" when sending pre-rendered block DOM","Check the API request body for typos in the dataType field"],"exampleFix":"// before\n{\"dataType\": \"md\", \"data\": \"# heading\"}\n// after\n{\"dataType\": \"markdown\", \"data\": \"# heading\"}","handlingStrategy":"validation","validationCode":"const ALLOWED = [\"markdown\", \"dom\"];\nif (!ALLOWED.includes(payload.dataType)) throw new Error(`dataType must be one of ${ALLOWED}`);","typeGuard":"const isBlockDataType = (t) => t === \"markdown\" || t === \"dom\";","tryCatchPattern":null,"preventionTips":["Use constants for dataType values instead of raw strings","Check the current API docs for accepted dataType values","Add client-side enum validation before sending requests"],"tags":["api","validation","enum-value","block-update"],"backgroundTag":"invalid-enum-value","analyzedSha":"9f775e8a12daef8255556097396f9b2739078892","analyzedAt":"2026-09-19T03:17:15.984Z","contentChangedAt":"2026-09-19T03:17:15.984Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}