快速设置REST服务器和GraphQL服务器

在上一篇关于使用JavaScript的Import和Vue组件的文章后继续,我将整理并介绍一下模板环境的使用方法。
这次主题是关于服务器端,我将记录下REST服务器和GraphQL服务器的启动方法作为备忘录。

模板已经上传到以下GitHub。

poruruba/express_template 是一个在 GitHub 上的项目,

由于经常添加功能,因此可能还包含了未在此处列出的功能。

启动REST服务器

在api/controllers/的下方创建一个适当的文件夹,并创建index.js和swagger.yaml。

通常情况下,index.js会模拟通过API Gateway传递给Lambda的方式。

(i) 当使用JSON/POST调用时

接收到的调用可以在index.js的exports.handler中接收。要获取指定的参数,请按以下方式操作。

exports.handler = async (event, context, callback) => {
    var body = JSON.parse(event.body);

(ii) 在GET调用的情况下

同样,接收到的调用可以在index.js的exports.handler中接收。若要获取QueryString参数,可以按以下方式进行。

exports.handler = async (event, context, callback) => {
    var params = event.queryStringParameters;

由于通常以application/json的形式返回响应,因此我们准备了辅助函数来以这种方式返回。像这样返回。

    return new Response({ message: 'Hello World' });

如果要以二进制返回,则可以按照以下方式进行。

    return new BinResponse("application/octet-stream", buffer);

如果以文本形式回答的话,可以这样写。

    return new TextResponse("text/html", str);

如果想要进行重定向,请按照以下方式进行。

    return new Redirect(url);

请参考位于api/controllers文件夹下的示例,swagger.yaml文件定义了端点。在Swagger2.0的定义中,指定了paths和definitions(实际上只引用了端点名称……)。

我让您可以设置一些选项。

〇选项标签:x-handler

 x-handler: 任意

通常情况下,当调用端点时,将调用index.js中的exports.handler函数,但如果希望通过其他函数名进行调用,则在此处进行指定。
虽然不是用于身份验证验证,但会解析并将结果传递给index.js。

〇选项标签:安全

security:
- basicAuth: []
- tokenAuth: []
- apikeyAuth: []
- jwtAuth: []

基本认证:Client ID和Client Secret以Base64编码的授权信息。

Authorization: basic [Bases64编码(‘client_id’:’client_secret’)]

tokenAuth:当指定OpenID Connect或OAuth2的令牌时,这是用于认证的信息。
Authorization: bearer [Token]

apikeyAuth:使用API密钥进行身份验证。
X-API-KEY:[APIKey]

jwtAuth: 这是用于GCP Cloud Endpoint身份验证的认证信息。
Authorization: bearer [Token]

只有在设置了Authorization头并进行调用的情况下才需要指定。解析结果将存储在req.requestContext中。

〇选项标签:x-functype

x-functype: (express|empty|normal|alexa|lambda)

可以指定index.js的调用类型。通常情况下,使用normal,与通过API Gateway调用lambda时的行为相同,但如果想要更改类型,则可以指定。

如果你必须,为了避免遗忘,请按照以下的要求发送多部分文件。

处理〇文件(multipart/form-data)

parameters:
- in: formData
  type: file
  name: 任意

event.files.upfile[0]中存储接收到的二进制文件。

运行”npm run start”命令会搜索api/controllers/目录下的每个文件夹中的swagger.yaml文件,并自动读取定义的终点,然后启动终点。

另外,当访问 https://localhost:10080/swagger 时,您可以以文本形式获取到Yaml格式的Swagger定义。因此,您可以使用以下类似的Swagger编辑器来可视化端点,并进行试调用。

Swagger-Editor – https://editor.swagger.io/

swagger-api/swagger-editor
https://github.com/swagger-api/swagger-editor

swagger-api / swagger-editor
https://github.com/swagger-api/swagger-editor

请在“文件”⇒“导入URL”的对话框中输入打开的上述URL。

image.png

您可以通过运行`npm run swagger`来合并每个文件夹中的swagger.yaml文件并将其输出为api/swagger/swagger.yaml文件。

启动GraphQL服务器

在api/controllers/下创建一个合适的文件夹,然后创建index.js和schema.graphql文件。

在index.js中,我们将按照以下方式获取参数,并根据在schema.graphql中定义的响应返回进行实现。

以下是一些例子。

exports.handler = async(parent, args, context, info) =>{
    console.log("args", JSON.stringify(args));
    console.log("path", info.path);

    return "Hello World";
};

当然,schema.graphql是GraphQL。
※由于尚未实施Subscription,因此写了也无法动作。。。

比如说就是这种感觉。

type Query {
  hello(message: String, param: Int): String
}

我們讓用戶能夠透過註解定義選項。

@endpoint注解

schema @endpoint(endpoint: "/mygraphql"){
  query: Query,
}

如果添加上述注释,则可以在指定的端点名称上启动GraphQL端点。
在上述示例中,端点将如下所示。

http://localhost:10080/mygraphql :请以中文给出以下句子的同义表达,只需一个选项:

如果没有上述的注释,端点将自动分配如下。

http://localhost:10080/【Folder Name】

@handler注解

type Query @handler(handler: "fulfillment", type: "lambda"){
  hello(param1: String, param2: Int): MyModelType
  test: [ToDo]
}

一般情况下,调用index.js是以express_graphql的调用形式进行的,但可以使用type: lambda来模拟AWS的AppSync。

通常情况下,我们会以express_graphql的形式来调用index.js,但是如果使用type: lambda的话,可以实现类似AWS的AppSync。

通常情况下,handler的定义是通过调用index.js的exports.hander来实现的,但如果想要更改名称,则需要指定。如果将handler命名为fulfillment,则会调用以下部分。

exports.fulfillment = async(parent, args, context, info) =>{

再者,还有GraphQL浏览器。
当在浏览器中打开http://localhost:10080/graphql时,会显示以下页面。
页面上显示了自动启动的GraphQL文件夹名称。

image.png

选择其中一个选项后,将启动以下类型的GraphQL资源浏览器,您可以在此确认GraphQL的Query或Mutation定义,并尝试实际执行。

image.png

助手

我们在api/helpers/目录中为连接Alexa Skills、Alexa智能家居、Clova、LINE Bot、Slack、Dialogflow等的便捷助手提供了准备。

可能在未来进行修改,但暂时请参考以下内容。基础环境不是模板环境,而是Swagger-Node环境,但是助手的使用方法是一样的。

使用Swagger在Lambda上创建调试环境。(1)

终结

这个也可以作为参考。试着使用JavaScript的Import和Vue的组件。

以上

广告
将在 10 秒后关闭
bannerAds