ByteNoteByteNote
本地库连上后再读写用户
字

字节笔记本

2026年10月7日 · 约 5 分钟读完

本地库连上后再读写用户

API中转
¥120

提问写的是用 Gin 连接 mango。示例按 Mongo 来接。连接串是本机 27017,没有账号和密码。库名 testdb,集合 users。这是本机示例,不要把空的鉴权当成线上写法。

启动只做连接和探测

用户结构有姓名、邮箱和创建时间。创建时间的字段名写成 CreateAt,少了一个字母。对应的 JSON 和文档字段都是 create_at。客户端若发送 created_at,这一项不会进结构体。

邮箱没变也会被判成没找到

初始化用十秒超时。先连接,再 Ping。失败就退出进程。集合句柄在 Ping 成功之后取。日志打出已连接。

超时上下文在初始化函数返回时取消。连接和 Ping 都发生在返回之前,这次取消不会打断它们。后面的处理函数用的是背景上下文,不再用这十秒的上下文。

路由挂在 /api 下面。创建和列表是 /users。按名字读取、更新、删除是 /users/ 加名字。服务听 8080。

创建时先绑定 JSON。绑定失败返回 400,错误信息来自绑定。然后把创建时间写成当前时间,再插入。插入失败返回 500。成功返回 201 和这份用户。

列表用空条件查找全部。游标关闭放在延迟调用里。循环里解码,解码的错误没有判断。解码失败时,空结构仍可能被放进切片。返回前也没有看游标自身的错误。

按名字读取用名字相等做条件。找不到返回 404,文案是 User not found。找到就返回这份用户。集合上没有唯一索引。同名有多条时,只会取到一条。

更新只设置邮箱。名字来自路径,不从正文改名。驱动返回错误时给 500。修改条数为 0 时给 404,文案同样是没找到。

修改条数为 0 还有一种情况:文档在,但邮箱和新值相同。匹配到了,却没有修改。这段代码会把它说成没找到。判断应看匹配条数。没匹配到才是没有这个名字。匹配到了只是没有变化,应返回成功或另一则说明。

删除看删除条数。为 0 才是没找到。删除和更新的判断不一样。删除条数为 0 能代表没有这个名字。更新要用匹配条数,不能照搬修改条数。

创建没有拒绝重复名字。后面的读取、更新、删除都把名字当唯一键。两条同名记录时,更新和删除只会影响其中一条,另一条还在。示例若要按名字操作,应在集合上保证名字不重复。

修改条数不是匹配条数

连接失败会让进程在启动时退出。这是示例的选择。调用方不会看到 JSON 错误,服务直接没有监听。本机没有数据库时,先看启动日志,不要先改路由。

按名字操作却没有唯一约束

插入使用背景上下文,没有再设超时。初始化的十秒只覆盖启动时的连接和 Ping。请求阶段卡住时,不会被那十秒打断。

绑定用的是 JSON 标签。姓名和邮箱都是字符串。缺字段会变成空字符串,绑定不一定失败。400 只出现在 JSON 本身无法读入结构体的时候。

创建时间由服务端写入。客户端传上来的创建时间会被覆盖。字段名又是 CreateAt。读写约定要以 create_at 为准,不要在文档里再存一份拼写不同的时间。

列表在没有用户时,切片可能是空的 nil。编码成 JSON 时要确认调用方能接受 null 或空数组。对话的代码直接返回这个切片,没有先把它初始化成空数组。

按名字的路径参数就是名字字符串。名字里若有特殊字符,路由已经解码。查询条件用的是解码后的值。不要再手动拼进一条查询字符串。

更新的设置操作只包含邮箱。正文里的姓名被读进结构体,却没有写回文档。想改名的请求会看起来成功或被判为没找到,名字却不变。以代码为准:这里只改邮箱。

Ping 的第二个参数是空。连接串没有认证。本机默认实例可以这样。换到需要账号的实例时,连接串要补上认证,并仍用超时上下文做第一次 Ping。

示例把驱动的连接、集合和五个处理函数放在同一个文件。路由组是 api。完整路径带这个前缀。用工具请求时不要漏掉 /api。

提问里的拼写是 mango。依赖和连接串用的是 mongo。按错误拼写去找包会找不到。以导入路径里的 mongo 为准。

启动日志是 Connected to MongoDB!。看到这句再请求用户接口。没看到这句,请求不会有 JSON,进程已经退出。

处理函数里的 404 文案有两处相同。更新在邮箱没变时也会用这句。排查时同时看数据库里的邮箱是否其实已经是新值。

删除成功的消息是 User deleted successfully。更新成功是 User updated successfully。创建成功没有这句消息,直接返回用户文档。三种响应形状不一样,调用方不要只按消息字段判断。

相关文章

分享: