为了账号安全,请及时绑定邮箱和手机立即绑定

Angular中集成GraphQL:从入门到精通的全面指南

标签:
AngularJS API

将 Angular 与 GraphQL 集成:设置方法、使用说明、好处以及搭建一个简单的 Node.js 服务器。

Angular 配合 GraphQL 一起使用

简介

在现代应用开发中,选择合适的前端与后端通信技术非常重要。GraphQL 是一种强大的 REST 替代方案,提供了更灵活和高效的数据获取方法。本文将探讨如何在 Angular 18 应用中设置和使用 GraphQL,利用独立组件特性,并探讨其应用场景和优势。

一个GraphQL是什么呢?

GraphQL 是由 Facebook 开发的一种 API 查询语言,它允许你请求确切需要的数据,而不会有任何冗余。与 REST 不同,REST 的固定端点总是返回预定义的数据,而 GraphQL 则允许你自定义响应结构。

GraphQL的好处
  1. 数据检索效率: 通过允许你在单次调用中请求所需的确切数据,减少请求次数。
  2. 灵活性: 允许客户端定义返回数据的结构,避免过度获取数据和获取不足数据的问题。
  3. 快速开发: 促进 API 的演变,无需创建新版本。
  4. 强类型: 利用类型系统帮助避免常见的错误。
在 Angular 18 应用中设置 GraphQL
1. 安装依赖(安装所需的库和工具)

首先,我们需要安装必要的库。我们将使用Apollo客户端,这是一个流行的用于Angular应用的GraphQL客户端。

运行此命令以添加apollo-angular插件:  
ng add apollo-angular
2. 设置 Apollo 客户端

创建一个名为 graphql.provider 的文件来设置 Apollo 客户端的配置。

    import { ApplicationConfig, inject } from '@angular/core';  
    import { ApolloClientOptions, InMemoryCache } from '@apollo/client/core';  
    import { Apollo, APOLLO_OPTIONS } from 'apollo-angular';  
    import { HttpLink } from 'apollo-angular/http';  

    const uri = 'http://localhost:4000'; // <-- 请在这里添加 GraphQL 服务器的 URL  
    export function apolloOptionsFactory(): ApolloClientOptions<any> {  
      const httpLink = inject(HttpLink);  
      return {  
        link: httpLink.create({ uri }),  
        cache: new InMemoryCache(),  
      };  
    }  

    export const graphqlProvider: ApplicationConfig['providers'] = [  
      Apollo,  
      {  
        provide: APOLLO_OPTIONS,  
        useFactory: apolloOptionsFactory,  
      },  
    ];
3. 配置 Apollo 模块

在您的应用程序的主模块中,导入并设置 ApolloModule。

    import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';  
    import { provideRouter } from '@angular/router';  

    import { routes } from './app.routes';  
    import { provideClientHydration } from '@angular/platform-browser';  
    import { provideHttpClient } from '@angular/common/http';  
    import { graphqlProvider } from './graphql.provider';  

    export const appConfig: ApplicationConfig = {  
      providers: [  
        provideZoneChangeDetection({ eventCoalescing: true }),  
        provideRouter(routes),  
        provideClientHydration(),  
        provideHttpClient(),  
        graphqlProvider  
      ]  
    };
如何在 Angular 组件中使用 GraphQL
1. 查询(内容)

我们来创建一个名为 user.service.ts 的文件来管理 GraphQL 查询吧。

    import { Injectable } from '@angular/core';  
    import { Apollo, gql } from 'apollo-angular';  
    import { Observable } from 'rxjs';  
    import { map } from 'rxjs/operators';  

    @Injectable({  
      providedIn: 'root',  
    })  
    export class UserService {  

      private PATH = "/graphql";  
      private HOST = "http://localhost:4000";  
      private fullUrl = this.HOST + this.PATH;  

      constructor(private apollo: Apollo) { }  

      getUsers(): Observable<any> {  
        return this.apollo  
          .watchQuery({  
            query: gql`  
              query {  
                users {  
                  id  
                  name  
                  email  
                }  
              }  
            `,  
            context: {  
              uri: this.fullUrl,  
            },  
          })  
          .valueChanges.pipe(map((result: any) => result.data.users));  
      }  
    }
2. 突变现象

除了查询之外,我们还可以执行修改操作来更改数据。在 user.service.ts 文件中添加一个这样的修改操作。

    创建用户(姓名: string, 电子邮件: string): Observable<any> {  
        return this.apollo.mutate({  
          mutation: gql`  
            mutation ($姓名: String!, $电子邮件: String!) {  
              创建用户(姓名: $姓名, 电子邮件: $电子邮件) {  
                id  
                姓名  
                电子邮件  
              }  
            }  
          `,  
          context: {  
            uri: this.fullUrl,  
          },  
          变量: {  
            姓名: 姓名,  
            电子邮件: 电子邮件,  
          },  
        }).pipe(map((结果: any) => 结果.data.创建用户));  
      }
在独立组件中使用服务功能

让我们创建一个独立的组件,利用 UserService 来获取及创建用户。

1. 组件配置

创建一个叫 user.component.ts 的文件。

import { CommonModule } from '@angular/common';  
import { Component, inject } from '@angular/core';  
import { UserService } from './user.service';  

@Component({  
  selector: 'app-user',  
  standalone: true,  
  imports: [CommonModule],  
  template: `  
    <div>  
      <h1>用户列表</h1>  
      <ul>  
        <li *ngFor="let user of users">{{ user.name }} ({{ user.email }})</li>  
      </ul>  
      <button (click)="addUser()">新增用户</button>  
    </div>  
  `,  
})  
export class UserComponent {  
  private userService = inject(UserService);  
  users: any[] = [];  

  constructor() {  
    this.userService.getUsers().subscribe((data) => (this.users = data));  
  }  

  addUser() {  
    this.userService.createUser('新用户 (New User)', 'newuser@example.com').subscribe((user) => {  
      const newUsers = [...this.users];  
      newUsers.push(user);  
      this.users = newUsers;  
    });  
  }  
}
使用 Node.js 创建一个 GraphQL 服务

为了支持你的 GraphQL API,我们来用 Node.js、express 和 apollo-server-express 创建一个简单的服务器来支持你的 GraphQL API。

1. 新建一个 Node.js 项目

首先,为你的项目创建一个新的文件夹,然后初始化你的 Node.js 项目。

    创建一个名为my-graphql-server的目录  
    转到my-graphql-server目录  
    使用npm初始化一个新的项目,自动确认所有默认设置
2. 安装依赖

安装所需的依赖项:

    npm install express apollo-server-express graphql
3. 设置服务器。

在你项目根目录下创建一个名为 server.js 的文件,并在里面加上下面这段代码。

const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');

// 定义 GraphQL 架构
const typeDefs = gql`
  type User {
    id: ID!
    name: String!
    email: String!
  }

  type Query {
    users: [User]
  }

  type Mutation {
    createUser(name: String!, email: String!): User
  }
`;

// 模拟数据
let users = [
  { id: '1', name: 'John Doe', email: 'john@example.com' },
  { id: '2', name: 'Jane Smith', email: 'jane@example.com' },
];

// 定义解析函数
const resolvers = {
  Query: {
    users: () => users,
  },
  Mutation: {
    createUser: (parent, args) => {
      const newUser = { id: String(users.length + 1), ...args };
      users.push(newUser);
      return newUser;
    },
  },
};

// 初始化 Apollo Server
const server = new ApolloServer({ typeDefs, resolvers });

const app = express();
server.start().then(res => {
  server.applyMiddleware({ app });

  // 启动服务
  app.listen({ port: 4000 }, () => 
    console.log(`服务已启动并运行于 http://localhost:4000${server.graphqlPath}`)
  );
});
4. 运行服务器端

现在,运行服务器的命令如下:

# 可以在这里填入具体的命令
运行 `node server.js`

你的 GraphQL 服务器将会在 http://localhost:4000/graphql 这个地址运行。

测测服务器

你可以使用 Apollo Sandbox 或任何 GraphQL 客户端来测试 GraphQL 服务器。这里有一些查询和变异操作的示例供你测试。

查询:获取用户信息

{
  query {
    用户 {
      id
      名字
      邮箱
    }
  }
}

突变:创建用户账号

mutation {  
  createUser(name: "New User", email: "newuser@example.com") {  
    id  
    name  
    email  
  }  
}
使用案例
  1. 仪表板应用: 在这里需要高效地从不同的来源获取特定数据并进行整合。
  2. 管理系统: 用于处理创建、读取、更新和删除(CRUD)数据的复杂操作任务。
  3. 电子商务: 为了优化产品搜索和展示,包括动态筛选和分类等功能。
总结

在 Angular 18 中集成 GraphQL 可以为应用程序开发的效率和灵活性带来许多好处。从设置到执行查询和变异的过程,可以使用 GraphQL 让开发者更好地获取和操作数据。此外,在 Node.js 中创建一个 GraphQL 服务器非常简单,并且可以迅速配置以满足您的 API 需求。

接下来的方法步骤
  • 实现GraphQL中的身份验证
  • 使用订阅功能来实现实时更新
  • 探索GraphQL性能监控工具的使用

访问该仓库点击这里

关注我领英上的动态: https://www.linkedin.com/in/erickzanetti

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消