深入 Egg.js:实现用户频道详情获取
在这篇文章中,我们将详细介绍如何在 Egg.js 中实现用户频道详情的获取。通过创建路由、定义模型、完善控制器,我们一步步构建这个功能,并通过 Postman 验证其正确性。
创建路由
首先,我们需要在 app/router.js
中定义一个新的路由:
module.exports = app => {
const { router, controller } = app;
const auth = app.middleware.auth()
// 添加前缀
router.prefix('/api/v1')
// 用户频道
router.get('/users/info/:userId', auth({required: false}), controller.user.userInfo)
};
这个路由定义了一个 GET 请求,用于获取用户的频道信息,并使用 auth
中间件进行认证。
创建模型 model/subscribe.js
接下来,我们需要定义一个新的 Mongoose 模型,用于存储用户的订阅信息:
// app/model/subscription.js
module.exports = app => {
const mongoose = app.mongoose
const Schema = mongoose.Schema
const subscribeSchema = new Schema({
user: { // 订阅用户
type: mongoose.ObjectId,
ref: 'User',
required: true
},
channel: { // 订阅频道
type: mongoose.ObjectId,
ref: 'User',
required: true
},
createdAt: { // 创建时间
type: Date,
default: Date.now
},
updatedAt: { // 更新时间
type: Date,
default: Date.now
}
})
return mongoose.model('Subscribe', subscribeSchema)
}
这个模型定义了用户订阅频道的基本结构,包括订阅用户、订阅频道、创建时间和更新时间。
完善控制器 controller/user.js
然后,我们需要在控制器中实现获取用户频道详情的逻辑:
const Controller = require('egg').Controller
class UserController extends Controller {
async userInfo() {
const registerUserId = this.ctx.user ? this.ctx.user._id : null
const userId = this.ctx.params.userId
const { Subscribe, User } = this.app.model
let isSubscribe = false
if (registerUserId) {
const subscribe = await Subscribe.findOne({
user: registerUserId,
channel: userId
})
if (subscribe) {
isSubscribe = true
}
}
let userInfoDb = await User.findById(userId)
let userInfo = userInfoDb._doc
userInfo.isSubscribe = isSubscribe
this.ctx.body = userInfo
}
}
module.exports = UserController
这个控制器方法 userInfo
首先检查当前用户是否已登录,然后查询用户是否订阅了该频道,并返回用户信息及订阅状态。
使用 Postman 验证
最后,我们使用 Postman 对这个接口进行测试,确保其功能正常。测试步骤如下:
- 启动服务并打开 Postman。
- 发送 GET 请求到
http://localhost:7001/api/v1/users/info/{userId}
。 - 检查返回的数据,验证用户信息和订阅状态是否正确。
总结
在本文中,我们通过创建路由、定义 Mongoose 模型、实现控制器逻辑,完成了 Egg.js 中获取用户频道详情的功能。通过这一系列操作,我们可以更好地理解如何在 Egg.js 中构建复杂的业务逻辑,提升开发效率和代码质量。
转载自:https://juejin.cn/post/7377217883305328678