使用Serverless Framework在Lambda上创建GraphQL API

使用Lambda和DynamoDB创建无服务器GraphQL API的方法我们基本上是参考了这篇文章:https://www.serverless.com/blog/make-serverless-graphql-api-using-lambda-dynamodb

然而,我们将事件处理程序改为async函数,并接受POST请求而非GET请求。此外,在上述示例中,我们使用了GraphQLSchema()等函数,但在定义模式等方面,我们参考了GraphQL.js官方页面的指南。开始使用GraphQL.js,请参考以下链接:
https://graphql.org/graphql-js/

那个《如何制作无服务器GraphQL API》的东西,你几乎没怎么参考吧?哈哈

最后的结论

毫無困難,只需要從 event.body 中取出 POST 請求中傳送的值,然後將其傳遞給 graphql() 函數的第二個參數。

命令和代码

$ sls create -t aws-nodejs-typescript -p sample-graphql-lambda-api
$ yarn init -y
$ yarn
$ yarn add graphql
// 下記追加
// その他、region(ap-northeast-1など)を追加するのを忘れずに。
  functions: {
    query: {
      handler: "handler.query",
      events: [
        {
          http: {
            method: "post",
            path: "graphql",
          },
        },
      ],
    },
  }
//import { APIGatewayProxyHandler } from "aws-lambda";
import "source-map-support/register";
import {
  graphql,
  buildSchema
} from "graphql";

const schema = buildSchema(`
  type Query {
    hello: String
  }
`);

const root = {
  hello: () => {
    return "Hello world!";
  },
};

export const query = async (event) => {
  const query = event.body;
  const result = await graphql(schema, query, root);
  const response = {
    statusCode: 200,
    body: JSON.stringify(result),
  };
  return response;
};
$ curl --request POST --header "Content-Type: application/json" --data "{ hello }" '{Lambda関数のエンドポイント }}'

{"data":{"hello":"Hello world!"}}

结束了。

在使用解析器提取参数时,{ person }是指什么?

如果需要对参数进行相加或返回多个数据的情况。

const schema = buildSchema(`
  type Query {
    hello(person: String): Text
  }
  type Text {
    text1: String,
    text2: String
  }
`)

const root = {
  hello: ({ person }) => {
    return { text1: `${person}さん、こんばんは!!!!!!!!!!`, text2: "おはようございます" }
  }
}
$ curl --request POST --header "Content-Type: application/json" --data "{ hello(person: \"tarou\"){text1 text2 }}" '{Lambda関数のエンドポイント }'

{"data":{"hello":{"text1":"tarouさん、こんばんは!!!!!!!!!!","text2":"おはようございます"}}}

在设置用于每个查询的函数中从根对象中提取参数时,我曾想过为什么不是使用person而是{ person }。

这是一种JavaScript的语法,似乎是解构赋值。

var origin = {a:1, b:2, c:3};
var {a} = origin;
var {b} = origin;
var {c} = origin;
console.log(‘a = ‘ + a); // a = 1
console.log(‘b = ‘ + b); // b = 2
console.log(‘c = ‘ + c); // c = 3

原始代码中,使用中括号将变量名括起来进行变量声明。

看起来是从对象中提取指定属性的值,并将其赋值给同名变量。
换句话说,似乎在分配给每个查询的根对象的函数参数中传递了对象。
顺便提一下,在curl中,也是以”–data “{ hello(person: \”tarou\”){text1 text2 }}”的形式传递personkey的(如果没有这个会出错)。

顺便说一句,据说“root对象每次分配一个查询的函数”被称为“解析函数”。

// 根据每个API终点提供解析器函数的根节点
var root = {
hello: () => {
return ‘你好,世界!’;
},
};
使用GraphQL.js入门

番外編太长了。
另外,AppSync是什么?如果使用GraphQL,是不是应该用这个而不是API Gateway呢?

广告
将在 10 秒后关闭
bannerAds