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

  1. Use dataType = "markdown" when input is markdown text, or "dom" when input is already SiYuan DOM HTML.
  2. Whitelist dataType at the caller before invoking the API.
  3. 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

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


AI-assisted analysis of siyuan-note/siyuan@251596fc0d (2026-08-12). Data as JSON: /api/errors/555bee0ac3fd31a2. Report an issue: GitHub.