首页 > 其他分享 >Graphql(五)Apollo 文件传输

Graphql(五)Apollo 文件传输

时间:2023-05-21 21:22:33浏览次数:57  
标签:const URL await 文件传输 upload Graphql file graphql Apollo

本文介绍如何在Apollo GraphQL中实现文件的传输

文件传输在GrapqhQL中官方建议

文章Apollo Server File Upload Best Practices提及了实现文件上传的几种方式,分别是:

  • Signed URLs
  • Using an image upload service
  • Multipart Upload Requests

本文介绍我所尝试过的第一种和第三种。

用grapqhl-upload的方式

graphql-upload是一个第三方的库,可以用来传输多个文件,也是实现文件传输的最简单方式。

在《Principled GraphQL》中,Apollo创始人们对Data Graph原则的指南中建议我们“将GraphQL层与服务层分离”。通常情况下,在生产客户端-服务器架构中,客户端不直接与后端服务进行通信。通常,我们使用一个额外的层来“将负载平衡、缓存、服务定位或API密钥管理等关注点委派给单独的层”。

对于新的业余项目(不太重要或概念验证),通常情况下,面向客户端的GraphQL服务也是执行业务逻辑、直接与数据库交互(可能通过ORM)并返回解析器所需数据的后端服务。虽然我们不建议在生产环境中使用这种架构,但这是开始学习Apollo生态系统的一种不错的方式。

注意:除非明确使用csrfPrevention: true配置Apollo Server,否则此方法容易受到CSRF变异攻击的影响。

下面给出示例:

首先安装graphql-upload:

npm install graphql-upload

在定义graph schema时,添加Upload类型:

scalar Upload

Javascript code:

const express = require('express');
const { ApolloServer, gql } = require('apollo-server-express');
const {
  GraphQLUpload,
  graphqlUploadExpress, // A Koa implementation is also exported.
} = require('graphql-upload');
const { finished } = require('stream/promises');
const { ApolloServerPluginLandingPageLocalDefault } = require('apollo-server-core');

const typeDefs = gql`
  # The implementation for this scalar is provided by the
  # 'GraphQLUpload' export from the 'graphql-upload' package
  # in the resolver map below.
  scalar Upload

  type File {
    filename: String!
    mimetype: String!
    encoding: String!
  }

  type Query {
    # This is only here to satisfy the requirement that at least one
    # field be present within the 'Query' type.  This example does not
    # demonstrate how to fetch uploads back.
    otherFields: Boolean!
  }

  type Mutation {
    # Multiple uploads are supported. See graphql-upload docs for details.
    singleUpload(file: Upload!): File!
  }
`;

const resolvers = {
  // This maps the `Upload` scalar to the implementation provided
  // by the `graphql-upload` package.
  Upload: GraphQLUpload,

  Mutation: {
    singleUpload: async (parent, { file }) => {
      const { createReadStream, filename, mimetype, encoding } = await file;

      // Invoking the `createReadStream` will return a Readable Stream.
      // See https://nodejs.org/api/stream.html#stream_readable_streams
      const stream = createReadStream();

      // This is purely for demonstration purposes and will overwrite the
      // local-file-output.txt in the current working directory on EACH upload.
      const out = require('fs').createWriteStream('local-file-output.txt');
      stream.pipe(out);
      await finished(out);

      return { filename, mimetype, encoding };
    },
  },
};

async function startServer() {
  const server = new ApolloServer({
    typeDefs,
    resolvers,
    // Using graphql-upload without CSRF prevention is very insecure.
    csrfPrevention: true,
    cache: 'bounded',
    plugins: [ApolloServerPluginLandingPageLocalDefault({ embed: true })],
  });
  await server.start();

  const app = express();

  // This middleware should be added before calling `applyMiddleware`.
  app.use(graphqlUploadExpress());

  server.applyMiddleware({ app });

  await new Promise<void>((r) => app.listen({ port: 4000 }, r));

  console.log(`

标签:const,URL,await,文件传输,upload,Graphql,file,graphql,Apollo
From: https://www.cnblogs.com/Asp1rant/p/17418809.html

相关文章

  • API架构的选择,RESTful、GraphQL还是gRPC
    hi,我是熵减,见字如面。在现代的软件工程中,微服务或在客户端与服务端之间的信息传递的方式,比较常见的有三种架构设计的风格:RESTful、GraphQL和gRPC。每一种模式,都有其特点和合适的使用场景,今天,我们主要来对三种风格做一个深入的理解和对比,以方便我们在做技术选型时,能够做出有效的......
  • 镭速传输:安全文件传输的意义
    文件共享解决方案如今无处不在。如果您搜索“在线文件共享服务”,那么您将获得如此多的页面,包括安全文件传输,安全文件共享,Google驱动器,虚拟数据室以及每个可以想象的解决方案。在高科技领域,企业处理机密信息,因此他们理解安全共享文档的重要性。这就是为什么企业主总是寻找可以为他......
  • 自动驾驶代码-Ros移植Apollo规划方案,可编译运行,包含autoware的Lanelet2框架。
    自动驾驶代码-Ros移植Apollo规划方案,可编译运行,包含autoware的Lanelet2框架。帮助大家快速入门实践。完善代码,加功能等。ID:31215675011337220......
  • hasura graphql-engine 支持mysql&oracle了
    hasuragraphql-engine这几年的变化很大,目前已经支持了不少数据库了,已经不单单是pg了,就在最近hasura对于mysql&oracle的支持已经处于beta阶段了说明hasuragraphql-engine对于其他数据库支持的玩法还是直接学习的(通过dataconnector解决)参考资料https://hasura.io/blog......
  • c#高性能服务器源代码,其中包括mvc api服务,http服务,ftp服务,sokect服务,websocket服务,大
    c#高性能服务器源代码,其中包括mvcapi服务,http服务,ftp服务,sokect服务,websocket服务,大文件传输服务。这些服务均抛开iis及第三支持,可写成服务或随软件启动而启动。ID:85320654113922032......
  • Linux文件传输FTP命令详解
    首先需要下载ftp客户端工具yuminstall-yftplftp语法ftp(选项)(参数)选项-d启动调试模式-u关闭自动认证-e不记录历史指令-i关闭交互模式-x在成功认证之后,协商密钥-n关闭自动登录功能-p传输文件模式为被动模式-v程序运行时......
  • 【python】http.server搭建局域网文件传输
    1、起因  因为测试需要向平板传输apk安装文件,插数据线比较麻烦,同一局域网起个服务方便又快捷,速度也快,linux下类似 2、官网文档  python3.11  https://docs.python.org/3/library/http.server.html  python2.7(自行了解)  https://docs.python.org/2.7/......
  • 分布式部署 apollo
    一台服务器部署多环境的apollo以windows环境为例,linux环境类似部署方式前置条件java环境、MySQL、gitBash、eureka注册中心apollo官网https://www.apolloconfig.com/一、下载安装包、数据库sql下载地址:https://github.com/apolloconfig/apollo/releases1.1下载安装包三个安......
  • croc-文件传输工具
    前言croc是一款用go语言开发的命令行文件传输工具,该工具允许两台计算机设备以一种简单和安全的方式来传输文件。GitHub项目地址环境信息IP系统版本croc版本说明192.168.0.10CentOS79.6.4中继服务192.168.0.11CentOS79.6.4模拟发送端192.168.0.12Cen......
  • 快速高效的C#FTP文件传输库FluentFTP
    简介:FluentFTP是一个用于C#语言的FTP客户端库,它提供了许多方便的功能和API,使FTP文件传输变得简单易用。FluentFTP的主要目标是提供简单易用的API,并同时提供足够的灵活性以满足大多数开发人员的需求。FluentFTP支持FTP和FTPS协议,可以通过简单的API进行连接、上传、下载、删除、重......