使用 curl 向 /{db} 插入一篇带“type:user”字段的 JSON 文档并拿到 201 状态码的完整命令?
解读
国内一线/二线互联网公司在现场或视频面试中,常把“用 curl 写一条插入”作为 CouchDB 基础实操题。
面试官关注的不是你会不会敲命令,而是能否一次性给出可复现、无语法错误、返回 201 且包含明确 type:user 字段的完整语句;同时默认你已具备权限、数据库已存在、Content-Type 正确、JSON 合法、id 策略清晰。
任何漏写 -H、漏写引号、id 冲突、大小写错误都会导致 400/409/415,直接扣分。
知识点
- CouchDB 插入即PUT /{db}/{docid}(指定 id)或 POST /{db}(由 UUID 生成 id);两者成功都返回 201。
- 必须显式声明 Content-Type: application/json,否则 415。
- 返回码 201 表示“已创建”,响应头 Location 指向新文档。
- 字段 type 为用户自定义,写成 "type":"user" 即可,CouchDB 不强制 schema。
- curl 在 Linux/Mac 下单引号包 JSON最稳;Windows PowerShell 需改双引号并转义内部双引号。
- 国内镜像或云厂商 CouchDB 往往开Basic 认证,需 -u user:pass;面试时如未提及可省略,但应口头补充“生产环境需加认证”。
- 若用 PUT,id 不能重复;若重复且不带 _rev 会 409;面试场景建议POST 让服务器生成 id,降低心智负担。
答案
以下命令在 Linux/Mac 终端直接执行可稳定拿到 201(假设数据库 demo 已存在,无认证):
curl -X POST http://127.0.0.1:5984/demo
-H "Content-Type: application/json"
-d '{"type":"user","name":"张三","age":28}'
执行后终端返回: {"ok":true,"id":"5f6bf1c8e7e9c52a9f8b6e7c9a0001f2","rev":"1-967a00dff5e02add41819138abb3294e"}
状态码 201 可通过加 -v 或 -w "%{http_code}" 验证。
拓展思考
- 幂等性对比:PUT 必须带 id,重复执行需附最新 _rev 才能更新;POST 每次产生新 id,天然幂等插入。
- 批量性能:生产环境用 _bulk_docs API 一次性提交百条,可减少 RTT 与 HTTP 连接开销。
- 权限加固:国内公有云 CouchDB 常关匿名写,需先 curl -u admin:password -X PUT http://ip:5984/_node/nonode@nohost/_config/admins/admin -d '"password"' 创建管理员,再在命令中加 -u 参数。
- 移动端同步:type:user 文档后续可通过 _changes feed 与 PouchDB 离线同步,面试可延伸“如何设计同步网关、冲突解决策略”。
- 数据合规:用户数据含手机号时需加密存储,国内需满足《个人信息保护法》,面试可提及“在写入前对敏感字段做 AES 加密,再存进 CouchDB”。