用户登录

我们可以说用户有一个用户档案,也可以说一个用户档案属于一个用户 .. 如果是第一种说法,我们可以在 User 模型里面使用 hasOne 去描述一下用户跟用户档案之间的关系 .. 如果是第二种说法,可以在 Profile 模型里,使用 belongsTo 去描述一下它跟用户模型之间的关系 ..

先打开 User 模型 .. 在 app .. models 目录的下面 .. 在这个模型的类里面可以添加一个方法,在这个方法里面使用 hasOne 去描述一下用户跟用户档案数据之间的关系 ..

这个方法的名字可以是 profile ... 方法 return 的是 this .. 用一下 hasOne 这个方法 .. 模型是 App/Models/Profile ..

使用一对一关系

现在可以去利用一下这个一对一的数据关系 .. 回到命令行 .. 再去创建一个控制器 .. adonis make 一个 controller .. 名字是 User .. 添加一个 --resource 选项,创建一个资源类型的控制器 ..

再找到这个 UserController 控制器 .. 在它里面需要用到 User 模型 .. 添加一个 User ... 模型是 App .. Models 下面的 User ...

然后找到这个模型里的的 show 这个方法 .. 可以先把 params 解构出来用一下 ..

这个 show ,是处理对单个资源请求用的方法 ... 添加一个 user ... await .. 用一下 User 的 find . 把用户的 id 号交给这个方法 .. params.id

返回的这个 user 是个 User 模型,我们在这个模型上添加了一个 profile 方法,里面用 hasOne 描述了一下它跟 Profile 这个模型的一对一的关系 ..

添加一个 profile ... await .. 用一下 user 上的 profile 这个方法 .. 接着再用一个 fetch ,返回的这个 profile 就是这个用户的用户档案 ..

先直接 return 一下这个 profile ... 这样会自动在这个 profile 模型上调用 toJSON ,把它转换成可用的数据 ..

再打开应用的路由 ... start 下面的这个 routes.js ... 添加一条 resource ,资源类型的路由 ..

资源是 users .. 用一下 UserController 这个控制器来处理对这种资源的请求 ..

下面可以在一个 REST 客户端上试一下 ... 我用的是 Insomnia .. 配置一个请求 .. 方法是 GET .. 地址是 localhost:3333/users 后面加上一个用户的 id ..

请求得到的响应就是 UserController 控制器的 show 这个方法返回来的东西 .. 这里应该就是 id 号是 1 的这个用户的资料档案 ..

我只需要这里的 github 这个字段的值 .. 回到项目 .. 在这个 profile 关系的下面,再用一个 select .. 指定一下需要的字段 ..

回到客户端 .. 再发送一下这个请求 .. 这回返回的用户资料里面,就只会包含这个 github 字段了 ..

现在我需要得到的响应里面包含用户相关的信息 .. 可以这样 ..

const .. username .. . email .. 等于 user.toJSON() .. 意思就是从执行 user.toJSON 这个方法返回的东西里面,把 username 还有 email 解构出来 ..

这次我们可以 return 一个对象 .. 里面添加一个 username ... 一个 email .. 再添加一个 profile .. 对应的值可以是 profile.toJSON() 返回的数据 ..

回到客户端 .. 再试一下 ..

这次出错了一个错误 .. 说 profile 上面没有 toJSON 这个方法 ..

回到项目 .. 这个是因为我们在用 user 模型的这个关系的时候没有添加 await ... 因为查询数据库是异步完成的,需要花点时间 .. 没处理完我们就在 return 的东西里面用了 profile 的 toJSON .. 所以会提示错误 ..

回到客户端 ... 再请求一下 ...

这次响应回来的内容里面,会包含用户名,用户的电子邮件 .. 还有来自 profiles 数据表里的数据 ..

一对一关系:描述与利用关系(使用 hasOne 方法)《 Node.js 应用:内容关系 》

统计

14696
分钟
0
你学会了
0%
完成

社会化网络

关于

微信订阅号

扫描微信二维码关注宁皓网,每天进步一点