siyuan-note/siyuan · warning
unsupported block data type [%s]
Error message
unsupported block data type [%s]
What it means
Returned by parseBlockUpdateData's default switch case. dataType must be exactly "markdown" or "dom"; anything else ("html", "text", "json", "", etc.) falls through to default and is rejected.
Source
Thrown at kernel/model/block_update.go:214
}
if "" != invalidID {
return "", errors.New("found invalid ID [" + invalidID + "]")
}
return
}
func parseBlockUpdateData(data, dataType string, luteEngine *lute.Lute) (ret string, tree *parse.Tree, err error) {
ret = data
switch dataType {
case "markdown":
ret, err = DataBlockDOM(data, luteEngine)
if err != nil {
err = fmt.Errorf("data block DOM failed: %w", err)
return
}
case "dom":
default:
err = fmt.Errorf("unsupported block data type [%s]", dataType)
return
}
tree = luteEngine.BlockDOM2Tree(ret)
if nil == tree || nil == tree.Root || nil == firstContentBlock(tree.Root) {
err = errors.New("parse tree failed")
}
return
}
func normalizeBlockUpdateTree(oldNode *ast.Node, tree *parse.Tree, luteEngine *lute.Lute) (ret *parse.Tree, updatedNode *ast.Node, err error) {
updatedNode, err = resolveBlockUpdateNode(oldNode, tree.Root)
if err != nil {
return nil, nil, err
}
updatedNode.Unlink()
root := &ast.Node{Type: ast.NodeDocument}View on GitHub (pinned to 251596fc0d)
Solutions
- Use dataType = "markdown" when input is markdown text, or "dom" when input is already SiYuan DOM HTML.
- Whitelist dataType at the caller before invoking the API.
- Lowercase and trim the value defensively before the call.
Example fix
// before
BlockUpdateInput{DataType: "html", Data: html}
// after
BlockUpdateInput{DataType: "dom", Data: domHTML} Defensive patterns
Strategy: validation
Validate before calling
switch dataType {
case "markdown", "dom":
default:
return fmt.Errorf("unsupported dataType %q", dataType)
} Type guard
func isValidDataType(t string) bool {
return t == "markdown" || t == "dom"
} Prevention
- Whitelist dataType at the caller before invoking the API.
- Lowercase and trim the value to avoid case/whitespace slip.
- Default to "dom" when the source is rendered HTML.
When it happens
Trigger: Client passes "html" or "text" as dataType; typo like "Markdown" or " DOM"; empty string from a missing field.
Common situations: Integration built against an older/newer API spec; client default value not set; case sensitivity slip.
Related errors
- block updates are empty
- invalid block ID [%s]
- found invalid ID [%s]
- list block has no list item
- block [%s] type is locked: expected %s, got %s
AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12).
Data as JSON: /api/errors/555bee0ac3fd31a2.
Report an issue: GitHub.