Egg.js实战:重构用户登录接口
引言
在本篇博客中,我们将使用Egg.js框架来重构用户登录接口。我们将从添加路由开始,然后配置token,接着在service中处理密码,生成token,最后添加controller。我们还将使用Postman进行接口验证。
添加路由
首先,我们需要在router.js
中添加路由。这里我们使用router.post
方法,将/users/login
路径映射到controller.user.login
方法。
js
module.exports = app => {
const { router, controller } = app;
router.post('/users/login', controller.user.login)
};
配置token
接着,我们需要在config.default.js
中添加token配置。这里我们使用jsonwebtoken
库,设置了secret和expiresIn。
js
module.exports = appInfo => {
// ...其它代码
config.jwt = {
secret: 'f2d1c153-39ec-4327-8c86-0d7308ad84f0',
expiresIn: '1d'
}
return {
...config,
...userConfig,
};
};
处理密码
在service
中,我们需要处理密码。因为在model中,我们设置了password为不可选,但是在登录时,我们需要通过email查找到password进行比对,所以我们需要在service
中进行处理。
js
const Service = require('egg').Service
const jwt = require('jsonwebtoken')
class UserService extends Service {
// ...其它代码
findEmail(email) {
return this.User.findOne({
email
}).select('+password')
}
}
module.exports = UserService
生成token
在service/user.js
中,我们需要封装token相关的方法。这里我们使用jsonwebtoken
库来生成token。
添加controller
最后,我们需要在controller/user.js
中添加controller。这里我们首先验证了用户输入的email和password,然后查找用户,如果用户不存在或者密码不正确,我们将抛出错误。如果验证通过,我们将生成token,并返回用户信息和token。
js
const Controller = require('egg').Controller
class UserController extends Controller {
async login() {
const userBody = this.ctx.request.body
this.ctx.validate({
email: { type: 'string' },
password: { type: 'string' }
}, userBody)
const user = await this.service.user.findEmail(userBody.email)
if (!user) {
this.ctx.throw(422, '用户未注册')
}
if (this.ctx.helper.md5(userBody.password) !== user.password) {
this.ctx.throw(422, '密码不正确')
}
const token = this.service.user.createToken({ user })
let userinfo = user._doc
delete userinfo.password
this.ctx.body = {
...userinfo,
token
}
}
}
module.exports = UserController
Postman验证
最后,我们使用Postman进行接口验证,验证结果如下图所示:
总结
以上就是使用Egg.js重构用户登录接口的全部内容。通过这个过程,我们可以看到Egg.js在处理用户登录这样的常见需求时,其强大的功能和灵活性。