1. 程式人生 > >使用lua graphql 模組讓openresty 支援graphql api

使用lua graphql 模組讓openresty 支援graphql api

graphql 是一個很不錯的api 查詢標準語言,已經有一個lua 的版本支援graphql

專案使用docker&&docker-compose 執行

環境準備

  • 模組安裝
luarocks install graphql
  • docker映象準備

    模組使用luarocks 安裝,預設alpine 映象是沒有安裝這個包,我們使用alpine-fat的

FROM openresty/openresty:alpine-fat
RUN /usr/local/openresty/luajit/bin/luarocks install graphql

專案程式碼

  • 專案結構
├── Dockerfile
├── README.md
├── app
├── docker-compose.yaml
└── nginx.conf
  • nginx.conf
worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    lua_code_cache off;
    gzip on;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    lua_package_path '/opt/app/?.lua;;';
    server {
        listen 80;
        server_name localhost;
        charset utf-8;
        root html;
        default_type text/html;
        location / {
           content_by_lua_block {
            require("html/app")()
          }
        }
      #  graphql 支援
        location /g {
           more_set_headers 'Content-Type application/json';
           content_by_lua_block {
            require("g/init")()
          }
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}
  • graphql 程式碼
app/g/init.lua
local parse = require 'graphql.parse'
local schema = require 'graphql.schema'
local types = require 'graphql.types'
local validate = require 'graphql.validate'
local execute = require 'graphql.execute'
local json = require "cjson"
-- Parse a query
local ast = parse [[
query getUser($id: ID) {
  person(id: $id) {
    firstName
    lastName
  }
}
]]

-- Create a type
local Person = types.object {
  name = 'Person',
  fields = {
    id = types.id.nonNull,
    firstName = types.string.nonNull,
    middleName = types.string,
    lastName = types.string.nonNull,
    age = types.int.nonNull
  }
}

-- Create a schema
local schema = schema.create {
  query = types.object {
    name = 'Query',
    fields = {
      person = {
        kind = Person,
        arguments = {
          id = types.id
        },
        resolve = function(rootValue, arguments)
          if arguments.id ~= 1 then return nil end
          return {
            id = 1,
            firstName = 'Bob',
            lastName = 'Ross',
            age = 52
          }
        end
      }
    }
  }
}

-- Validate a parsed query against a schema
validate(schema, ast)

-- Execution
local rootValue = {}
local variables = { id = 1 }
local operationName = 'getUser'

local function g()
   local result=execute(schema, ast, rootValue, variables, operationName)
   ngx.say(json.encode(result))
end
return g

執行

  • build 映象
docker-compose build
  • 執行
docker-compose up -d
  • 效果

參考資料

相關推薦

使用lua graphql 模組openresty 支援graphql api

graphql 是一個很不錯的api 查詢標準語言,已經有一個lua 的版本支援graphql 專案使用docker&&docker-compose 執行 環境準備 模組安裝 luarocks install graphql docker映象準備

使用ASP.NET Core支援GraphQL -- 較為原始的方法

GraphQL簡介 下面是GraphQL的定義: GraphQL 既是一種用於 API 的查詢語言也是一個滿足你資料查詢的執行時。 GraphQL 對你的 API 中的資料提供了一套易於理解的完整描述,使得客戶端能夠準確地獲得它需要的資料,而且沒有任何冗餘,也讓 API 更容易地隨著時間推移而演進,還能用於

使用 Apollo Client 快速構建一個支援 GraphQL 的 React App

這篇文章主要介紹 GraphQL 在 Client 的使用,為了方便,本文會直接使用 React 建立一個 Web demo 去介紹 Apollo 在 React 中的使用方法,當然在 ReactNative 中用法幾乎一模一樣。Apollo Client 是一個 GraphQL C

Lua模組、使用位操作BitOp、C APILua與C互相呼叫)

一、模組 1.1 概述 建立一個模組最簡單的方法是:         1. 建立一個table;         2. 並將所有需要匯出的函式放入其中;         3. 最後返回這個table。 1.2 程式碼 檔案:test.lua complex = {} f

通過擴充套件ASP.NET Web API支援JSONP

同源策略(Same Origin Policy)的存在導致了“源”自A的指令碼只能操作“同源”頁面的DOM,“跨源”操作來源於B的頁面將會被拒絕。同源策略以及跨域資源共享在大部分情況下針對的是Ajax請求。同源策略主要限制了通過XMLHttpRequest實現的Ajax請求

通過擴展ASP.NET Web API支持JSONP

web api enc pan star close web應用 lba dia 不存在 同源策略(Same Origin Policy)的存在導致了“源”自A的腳本只能操作“同源”頁面的DOM,“跨源”操作來源於B的頁面將會被拒絕。同源策略以及跨域資源共享在大部分情況下針

https-網站支援https協議2

上篇寫到怎麼搭建https://mp.csdn.net/postedit/79349084 顯示 域名剩餘天數: ./certbot-auto  certificates     手工更新: ./certbot-auto certonly --w

Django 實現HTML轉PDF 用通用檢視編寫PDF 並且PDF支援中文

Django 實現HTML轉PDF 用通用檢視編寫PDF 並且讓PDF支援中文 如何使用django-easy-pdf django-easy-pdf的依賴 安裝django-easy-pdf 使用過程中遇到的問題總結

MySQL支援Emoji表情 mysql 5.6

讓MySQL支援Emoji表情,涉及無線相關的 MySQL 資料庫建議都提前採用 utf8mb4 字符集。 mysql 版本 5.6     1 解決方案:將Mysql的編碼從utf8轉換成utf8mb4。    需要 >=

linux之終端支援C++11/14編譯cpp檔案

1  問題 我們的專案很多智慧指標,但是我linux的終端肯定不支援C++11/14, 我們平時都是用的下面的命令編譯c++檔案 g++ -g file.cpp -o file  r 如果是用c++11編譯需要改成如下 g++ -g -Wall -std=c+

Koa2學習系列08-解析JSON—— Koa2 支援響應 JSON 資料

JSON 資料 我顛倒了整個世界,只為擺正你的倒影。   前面的文章中,我們已經完成了專案中常見的問題,比如 路由請求、結構分層、檢視渲染、靜態資源等。 那麼,JSON 呢?JSON 格式資料的傳輸,已經深入到了我們的碼裡行間,脫離了

Linux系統裡vim支援markdown格式的語法高亮

Markdown是深受程式設計師喜愛的一個檔案格式。 然而Linux裡預設的vim設定,並不支援markdown格式的語法高亮顯示。 下面就來介紹如何設定使得markdown格式的檔案在vim裡也能享有語法高亮的待遇。 首先安裝一個vim的外掛管理工具: vim-pathogen 它的原始碼地址:

Fedora CentOS Red Hat中vim支援語法高亮設定

Fedora / CentOS / Red Hat這三個系統裡預設的vi是沒有語法高亮顯示的,白色的字型看起來很不舒服。 首先用命令列cat /etc/os-release檢視當前linux系統的型別,發現為Red Hat: 使用命令列yum install vim-enhanced下載vi的增強

postgresql支援儲存過程(函式)的除錯

原帖地址:http://blog.chinaunix.net/uid-280772-id-2135418.html 用PG做了些專案,積累了些經驗,其中之一就是在PG下除錯function。    可以設定break point,單步除錯,就象在eclipse

ASP.NET Core中使用GraphQL - 第八章 在GraphQL中處理一對多關係

ASP.NET Core中使用GraphQL - 目錄 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 ASP.NET Core中使用GraphQL - 第三章 依賴注入 ASP.NE

ASP.NET Core中使用GraphQL - 第八章 在GraphQL中處理一對多關系

得到 sta inventory 關系 object https col dot asf ASP.NET Core中使用GraphQL - 目錄 ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQ

ASP.NET Core中使用GraphQL - 第九章 在GraphQL中處理多對多關係

ASP.NET Core中使用GraphQL ASP.NET Core中使用GraphQL - 第一章 Hello World ASP.NET Core中使用GraphQL - 第二章 中介軟體 ASP.NET Core中使用GraphQL - 第三章 依賴注入 ASP.NET Cor

如何div支援focus事件

一般情況下,onblur事件只在input等元素中才有,而div卻沒有,因為div沒有tabindex屬性,所以要給div加上此屬性。 如: 1 <div tabindex="0" hidefocus="true" onfocus='a

linuxApache支援.htaccess偽靜態檔案時遇到的坑

相信很多人都在windows環境開發好專案後再佈置到linux上,但這個時候或許你發現你的偽靜態不起作用了,很無奈,或許你還沒進行相關配置。 這個時候你就得做一下幾步操作了。。。。。 第一、編輯httpd.conf檔案 ----------------- 1、 - 在etc/httpd/

uboot 支援 ubi

  轉載地址:http://blog.chinaunix.net/uid-15706699-id-2670964.html uboot已經支援ubi,只要在.h檔案中開啟巨集定義就可以了,修改如下:   //新增加對ubifs的支援 #define CONFI