使用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呢?