返回

GraphQL渐进学习:采用Egg.js开发服务端

前端

一、创建GraphQL服务

  1. 安装Egg.js

    首先,我们需要安装Egg.js。您可以使用以下命令进行安装:

    npm install egg --save
    
  2. 创建项目

    接下来,创建一个新的Egg.js项目。您可以使用以下命令创建项目:

    egg-init my-graphql-app
    
  3. 添加GraphQL插件

    为了能够使用GraphQL,我们需要添加GraphQL插件。您可以使用以下命令添加插件:

    npm install egg-graphql --save
    
  4. 配置GraphQL

    在项目的config/plugin.js文件中,我们需要配置GraphQL插件。您可以添加以下代码:

    module.exports = {
      graphql: {
        router: '/graphql',
        app: true,
        agent: false,
      },
    };
    
  5. 创建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,
    };
    

二、用户登录授权

  1. 创建用户模型

    首先,我们需要创建一个用户模型。您可以在项目的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;
    
  2. 创建登录路由

    接下来,我们需要创建一个登录路由。您可以在项目的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;
    

三、用户访问鉴权

  1. 在中间件中验证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;