使用万能 BFF,将语雀文章 GraphQL 服务化
几天前,我似乎吹了个牛,详见《一顿操作猛如虎,部署一个万能 BFF》。我号称部署了一个万能 BFF,即将 gatsby js 的本地开发用的 GraphQL 服务器,部署在了 AWS lambda上,从而可以借助 gatsby js 丰富的插件,实现所有数据源的对接,而不用再次开发(有点类似低代码的效果)。
小科普:AWS lambda,本质上是一个不需要编排的容器服务。
—— 现学现卖,今天去 AWS 听 Stan Lin 老师说的
吹完牛,还提前预告后面将用真实案例,讲解利用该万能 BFF 的使用场景。
今天就来一个真实场景,低代码实现语雀文章的 GraphQL 服务。尽管知道完全可行,但是真正搭建出来还是挺激动的。
在线演示
https://jqp5j170i6.execute-api.us-east-1.amazonaws.com/dev/gatsby/graphql
截图展示
语雀
语雀是一款相当优秀的在线文档编辑工具,我最喜欢它对文本绘图的支持。我前些年开始使用语雀来记录自己的想法,并且同步到自己的博客:https://jeff-tian.jiwai.win 。这个博客站点其实就是利用 gatsby js 生成的静态网站。它使用了 @jeff-tian/gatsby-source-yuque 这个插件读取语雀的文章。现在要做的,就是在万能 BFF 里重用该插件,将语雀文章以 GraphQL 的服务暴露出来。
在万能 BFF 里引入 @jeff-tian/gatsby-source-yuque
yarn add @jeff-tian/gatsby-source-yuque
配置(低代码开发)
要做到纯配置,还得对万能 BFF 做一点改进,不过这留作以后优化,现在可以做一丢丢开发,主要是将语雀的用户名和空间名灌进系统里。因此在万能 BFF 项目里,添加一个文件夹,命名为 yuque,定义一下 schema,以及实现 read 和 all 接口,从而实现全量查询和使用 id 查询单个文章。
import * as Joi from "@hapi/joi"
import {sourceNodes} from "@jeff-tian/gatsby-source-yuque/gatsby-node"
const schema = {
id: Joi.number(),
title: Joi.string(),
description: Joi.string(),
custom_description: Joi.string(),
updated_at: Joi.string(),
created_at: Joi.string(),
slug: Joi.string(),
word_count: Joi.number(),
cover: Joi.string(),
body: Joi.string(),
}
let articles = null
const readArticles = async () => {
if (articles) {
return articles
}
articles = await sourceNodes({
reporter: {
panic: console.error,
info: console.log,
error: console.error
},
actions: {
createNode: () => ({})
},
emitter: {
on: console.log
},
createNodeId: () => '...',
createContentDigest: () => '...'
}, {login: 'tian-jie', repo: `blog`})
return articles
}
const read = async (context, id) => {
const articles = await readArticles()
return articles.filter(a => String(a.id) === String(id))[0]
}
const all = async () => {
return await readArticles()
}
export {schema, read, all}
语雀 Token
其实,大功基本告成,但是直接部署运行,会碰到 401 错误。要解决这个问题,需要在语雀控制台申请一个令牌。但是,这个令牌无论如何不能写进代码里,因此,需要再对 serverless.yml
做个改造:
functions:
gatsby:
environment:
SERVERLESS_EXPRESS_PLATFORM: aws
YUQUE_TOKEN: ${env:YUQUE_TOKEN}
plugins:
serverless-dotenv-plugin
可以看出,需要用到 serverless-dotenv-plugin
插件,所以安装一下:
yarn add -D serverless-dotenv-plugin
这样,再次执行 YUQUE_TOKEN=xxx serverless deploy
就能安全地将语雀令牌发布到 AWS lambda 的环境变量里。
总结
通过在万能 BFF 里重用 @jeff-tian/gatsby-source-yuque
插件,低代码实现语雀文章的 GraphQL 服务。
感兴趣的同学请持续关注,后面会继续分享更多的万能 BFF 实际使用案例,以及在更多客户端(比如小程序中)使用该万能 BFF 的例子。
微信公众号链接不能点的问题,可以点击“阅读原文”,再在原文中点击链接。