返回
GraphQL渐进学习:采用Egg.js开发服务端
前端
2023-12-24 12:01:05
一、创建GraphQL服务
-
安装Egg.js
首先,我们需要安装Egg.js。您可以使用以下命令进行安装:
npm install egg --save
-
创建项目
接下来,创建一个新的Egg.js项目。您可以使用以下命令创建项目:
egg-init my-graphql-app
-
添加GraphQL插件
为了能够使用GraphQL,我们需要添加GraphQL插件。您可以使用以下命令添加插件:
npm install egg-graphql --save
-
配置GraphQL
在项目的config/plugin.js文件中,我们需要配置GraphQL插件。您可以添加以下代码:
module.exports = { graphql: { router: '/graphql', app: true, agent: false, }, };
-
创建GraphQL服务
现在,我们可以创建一个GraphQL服务。您可以在项目的app/graphql目录下创建一个新的文件,例如user.js。在文件中,您可以添加以下代码:
const { GraphQLObjectType, GraphQLString } = require('graphql'); const userType = new GraphQLObjectType({ name: 'User', fields: { id: { type: GraphQLString }, name: { type: GraphQLString }, email: { type: GraphQLString }, }, }); const queryType = new GraphQLObjectType({ name: 'Query', fields: { user: { type: userType, args: { id: { type: GraphQLString }, }, resolve: async (source, args, context) => { // 从数据库中查询用户数据 const user = await context.model.User.findById(args.id); return user; }, }, }, }); module.exports = { Query: queryType, };
二、用户登录授权
-
创建用户模型
首先,我们需要创建一个用户模型。您可以在项目的app/model目录下创建一个新的文件,例如user.js。在文件中,您可以添加以下代码:
const { Sequelize, Model } = require('sequelize'); class User extends Model {} User.init({ id: { type: Sequelize.STRING, primaryKey: true, }, name: Sequelize.STRING, email: Sequelize.STRING, password: Sequelize.STRING, }, { sequelize, modelName: 'user', }); module.exports = User;
-
创建登录路由
接下来,我们需要创建一个登录路由。您可以在项目的app/router目录下创建一个新的文件,例如login.js。在文件中,您可以添加以下代码:
const { Router } = require('egg'); const router = new Router(); router.post('/login', async (ctx) => { const { email, password } = ctx.request.body; // 从数据库中查询用户数据 const user = await ctx.model.User.findOne({ where: { email, password, }, }); if (!user) { ctx.status = 401; ctx.body = { message: '用户名或密码错误', }; return; } // 生成JWT令牌 const token = ctx.app.jwt.sign({ id: user.id, name: user.name, email: user.email, }, ctx.app.config.jwt.secret); ctx.body = { token, }; }); module.exports = router;
三、用户访问鉴权
-
在中间件中验证JWT令牌
为了对用户进行访问鉴权,我们需要在中间件中验证JWT令牌。您可以在项目的app/middleware目录下创建一个新的文件,例如auth.js。在文件中,您可以添加以下代码:
const { jwtVerify } = require('jsonwebtoken'); module.exports = () => { return async (ctx, next) => { const token = ctx.headers['authorization']; if (!token) { ctx.status = 401; ctx.body = { message: '无访问权限', }; return;