让我们用一个无服务器函数来制作一个二维码生成器!

Avatar of Geoff Graham
Geoff Graham

DigitalOcean 为您的旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费信用!

二维码很有趣,对吧? 我们爱他们,然后恨他们,然后又爱他们。 无论如何,他们最近又开始流行起来,这让我思考了他们的制作方式。 市面上有无数的二维码生成器,但假设您需要在自己的网站上执行此操作。 这个包 可以做到这一点。 但它也需要 180 KB 的重量才能生成所有内容。 您不希望将所有这些内容与其他脚本一起提供。

现在,我对云函数的概念还比较陌生,但我听说这对于像这样的东西来说是最好的。 这样,该函数就驻留在某个服务器上,可以在需要时被调用。 有点像运行函数的小 API。

一些主机提供某种云函数功能。 DigitalOcean 就是其中之一! 而且,与 Droplets 一样,函数也很容易部署。

在本地创建一个 functions 文件夹

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 包并导出一个基本上生成一个带有 base64 PNG 作为源的 <img> 标签的函数。 我们甚至可以在终端中测试它

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 并从那里生成二维码。

演示

我们 fetch 该 API,这就是全部!