用无服务器函数制作二维码生成器的方法

245 阅读3分钟

二维码很有趣,对吗?我们喜欢它们,然后讨厌它们,然后又喜欢它们。总之,它们最近又出现了,这让我想到了它们是如何产生的。外面有无数的二维码生成器,但如果说这是你需要在自己的网站上做的事情。这个软件包可以做到这一点。但它的重量也很重,有180KB,它需要生成所有的东西。你不会想把所有这些东西和你的其他脚本放在一起。

现在,我对云函数的概念比较陌生,但我听说这对像这样的东西来说是最棒的。这样一来,函数就存在于服务器上的某个地方,在需要的时候可以被调用。就像一个小的API来运行这个功能。

一些主机提供了某种云功能的功能。DigitalOcean恰好是其中之一。而且,像Droplets一样,函数的部署也非常容易。

在本地创建一个函数文件夹

DigitalOcean有一个CLI,与一个命令,将为我们提供脚手架的东西,所以cd ,无论你想设置的东西和运行。

doctl serverless init --language js qr-generator

注意语言是明确声明的。DigitalOcean的功能也支持PHP和Python。

我们得到了一个干净的项目,名为qr-generator ,有一个/packages 文件夹,存放着项目的所有函数。那里有一个示例函数,但我们现在可以忽略它,并在它旁边创建一个qr 文件夹。

该文件夹是qrcode 包和我们的qr.js 函数的所在地。因此,让我们把cdpackages/sample/qr 并安装该包。

npm install --save qrcode

现在我们可以在一个新的qr.js 文件中写下这个函数。

const qrcode = require('qrcode')

exports.main = (args) => {
  return qrcode.toDataURL(args.text).then(res => ({
    headers:  { 'content-type': 'text/html; charset=UTF-8' },
    body: args.img == undefined ? res : `<img src="${res}">`
  }))
}

if (process.env.TEST) exports.main({text:"hello"}).then(console.log)

所有这一切都需要qrcode 包,并导出一个函数,基本上可以生成一个<img> 标签,并以base64 PNG为源。我们甚至可以在终端测试它。

doctl serverless functions invoke sample/qr -p "text:css-tricks.com"

检查配置文件

这里有一个额外的步骤,我们需要。当项目被架起时,我们得到了这个小的project.yml 文件,它用一些相关信息配置了这个函数。这就是里面默认的内容。

targetNamespace: ''
parameters: {}
packages:
  - name: sample
    environment: {}
    parameters: {}
    annotations: {}
    actions:
      - name: hello
        binary: false
        main: ''
        runtime: 'nodejs:default'
        web: true
        parameters: {}
        environment: {}
        annotations: {}
        limits: {}

看到这些高亮的行了吗?packages: name 属性是函数在packages 文件夹中的位置,在本例中是一个叫做sample 的文件夹。actions/ name 属性是函数本身的名称,也就是文件的名称。当我们启动项目时,它默认为hello ,但我们把我们的命名为qr.js ,所以我们应该在继续前把这一行从hello 改为qr

部署函数

我们可以直接从命令行做这件事!首先,我们连接到DigitalOcean的沙盒环境,这样我们就有一个用于测试的实时URL。

## You will need an DO API key handy
doctl sandbox connect

现在,我们可以部署该函数了。

doctl sandbox deploy qr-generator

一旦部署,我们就可以在一个URL上访问该函数。这个URL是什么?这有一个命令。

doctl sbx fn get sample/qr --url
https://faas-nyc1-2ef2e6cc.doserverless.co/api/v1/web/fn-10a937cb-1f12-427b-aadd-f43d0b08d64a/sample/qr

糟糕的是!再也不需要把整个软件包和其他的脚本一起运送了!我们可以点击那个URL,从那里生成QR码。