{"record":{"id":"9f69067f42ac7d8f","repo":"siyuan-note/siyuan","slug":"attribute-view-item-markdown-is-nil","errorCode":null,"errorMessage":"attribute view item markdown is nil","messagePattern":"attribute view item markdown is nil","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/model/attribute_view_new_item.go","lineNumber":89,"sourceCode":"// CreateAttributeViewItemDocsResult 描述将游离条目批量转换为文档后的结果。\ntype CreateAttributeViewItemDocsResult struct {\n\tItemIDs        []string     `json:\"itemIDs\"`\n\tBlockIDs       []string     `json:\"blockIDs\"`\n\tSkippedItemIDs []string     `json:\"skippedItemIDs,omitempty\"`\n\tWarnings       []string     `json:\"warnings,omitempty\"`\n\tTransaction    *Transaction `json:\"-\"`\n}\n\n// CreateAttributeViewItem 按指定模板创建一个数据库条目。templateID 为空时创建空白游离条目。\nfunc CreateAttributeViewItem(avID, blockID, viewID, templateID, previousID, groupID string) (*CreateAttributeViewItemResult, error) {\n\treturn createAttributeViewItem(avID, blockID, viewID, templateID, previousID, groupID, nil)\n}\n\n// CreateAttributeViewItemWithMarkdown 按指定的文档类型模板创建数据库条目，并使用传入的 Markdown 创建绑定文档。\nfunc CreateAttributeViewItemWithMarkdown(avID, blockID, viewID, templateID, previousID, groupID string,\n\tdocument *CreateAttributeViewItemMarkdown) (*CreateAttributeViewItemResult, error) {\n\tif nil == document {\n\t\treturn nil, errors.New(\"attribute view item markdown is nil\")\n\t}\n\treturn createAttributeViewItem(avID, blockID, viewID, templateID, previousID, groupID, document)\n}\n\nfunc createAttributeViewItem(avID, blockID, viewID, templateID, previousID, groupID string,\n\tdocument *CreateAttributeViewItemMarkdown) (*CreateAttributeViewItemResult, error) {\n\tattrView, err := avParseView(avID, blockID)\n\tif nil != err {\n\t\treturn nil, err\n\t}\n\tcreatedAt := time.Now()\n\titemTemplate := attrView.GetNewItemTemplate(templateID)\n\tvar prunedOptions []*av.PrunedNewItemTemplateOption\n\tif \"\" != templateID && nil == itemTemplate {\n\t\treturn nil, fmt.Errorf(\"new item template [%s] not found\", templateID)\n\t}\n\tif nil == itemTemplate {\n\t\titemTemplate = &av.NewItemTemplate{TargetType: av.NewItemTargetDetached}","sourceCodeStart":71,"sourceCodeEnd":107,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/model/attribute_view_new_item.go#L71-L107","documentation":"CreateAttributeViewItemWithMarkdown creates a database row and a bound document from the supplied Markdown payload. The document parameter is mandatory; passing nil gives the function no content template, so it rejects the call before touching the attribute view.","triggerScenarios":"Calling CreateAttributeViewItemWithMarkdown with document=nil (the *CreateAttributeViewItemMarkdown pointer is nil).","commonSituations":"A caller that conditionally builds the document struct but hits a branch where it stays nil; JSON unmarshaling of the request body produced a nil object because the field was absent; copy-paste from CreateAttributeViewItem which takes no document parameter.","solutions":["Construct a *CreateAttributeViewItemMarkdown with at least the Markdown content (and Title if desired) before calling","If you do not need Markdown-bound documents, call CreateAttributeViewItem instead, which has no document requirement","In the API handler, validate the request payload's document field is present"],"exampleFix":"// before\nres, err := model.CreateAttributeViewItemWithMarkdown(avID, blockID, viewID, tplID, \"\", \"\", nil)\n// after\ndoc := &model.CreateAttributeViewItemMarkdown{Title: \"New Item\", Markdown: \"# New Item\\ncontent\"}\nres, err := model.CreateAttributeViewItemWithMarkdown(avID, blockID, viewID, tplID, \"\", \"\", doc)","handlingStrategy":"validation","validationCode":"if document == nil {\n    return errors.New(\"a Markdown document payload is required\")\n}","typeGuard":"func hasMarkdownDoc(d *model.CreateAttributeViewItemMarkdown) bool { return d != nil }","tryCatchPattern":"res, err := model.CreateAttributeViewItemWithMarkdown(avID, blockID, viewID, tplID, \"\", \"\", doc)\nif err != nil {\n    return fmt.Errorf(\"create item with markdown: %w\", err)\n}","preventionTips":["Construct the document struct at the call site, never forward a possibly-nil pointer","Unmarshal API request bodies into concrete structs and reject missing document fields","Use CreateAttributeViewItem when no Markdown binding is needed"],"tags":["api","null-check","attribute-view","go"],"backgroundTag":"null-argument","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}