二维码很有趣,对吧? 我们爱他们,然后恨他们,然后又爱他们。 无论如何,他们最近又开始流行起来,这让我思考了他们的制作方式。 市面上有无数的二维码生成器,但假设您需要在自己的网站上执行此操作。 这个包 可以做到这一点。 但它也需要 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
函数将要存在的地方。 因此,让我们 cd
到 packages/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,这就是全部!
您是否考虑过将其限制为特定推荐域或需要某种 API 令牌? 如果发现您的函数被滥用,并在月底收到 DO 的巨额账单,那就太糟糕了。
当然! 函数支持将访问权限限制为指定的应用程序和环境变量以隐藏密钥。
这是一个很棒的教程。 但如果有人想在不需要编写自己的函数的情况下做到这一点,可以使用 Google Chart API 来创建二维码; https://developers.google.com/chart/infographics/docs/qr_codes
@Matt 是的,我自己也用 Google Chart 的 API 创建了一个,非常简单!