このチュートリアルでは、QR コードを生成する Worker アプリケーションを構築して公開します。
このチュートリアルのコードを確認したい場合は、完成版のコードベースが GitHub で公開 ↗ されています。サンプルリポジトリのコードを使い、カスタマイズして、自分のプロジェクトにデプロイできます。
すべてのチュートリアルは、Cloudflare Workers アカウント、C3 ↗、および Wrangler のセットアップが完了している前提です。セットアップは Get started ガイド で行います。
まず、create-cloudflare CLI で新しい Cloudflare Workers プロジェクトを作ります。ターミナルを開き、次のコマンドを実行します。
npm create cloudflare@latest -- qr-code-generatoryarn create cloudflare qr-code-generatorpnpm create cloudflare@latest qr-code-generatorセットアップでは、次のオプションを選びます。
- What would you like to start with? では、
Hello World exampleを選びます。 - Which template would you like to use? では、
Worker onlyを選びます。 - Which language do you want to use? では、
JavaScriptを選びます。 - Do you want to use git for version control? では、
Yesを選びます。 - Do you want to deploy your application? では、
Noを選びます(デプロイ前にいくつか変更します)。
作成したディレクトリへ移動します。
cd qr-code-generator新しい qr-code-generator Worker プロジェクトのディレクトリでは、index.js が Cloudflare Workers アプリケーションのエントリポイントです。
Cloudflare Workers アプリケーションは、クライアントが Workers のルートへリクエストしたときに発生する fetch イベントの待ち受けから始まります。Worker がリクエストを受け取ったあと、アプリケーションが組み立てたレスポンスがユーザーに返ります。このチュートリアルでは、リクエスト / レスポンスのパターンの動きと、それを使って本格的なアプリケーションを作る方法を説明します。
export default {
async fetch(request, env, ctx) {
return new Response("Hello Worker!");
},
};既定の index.js では、このリクエスト / レスポンスのパターンがそのまま動いています。fetch は本文が 'Hello Worker!' の新しい Response を組み立てます。
Worker が fetch イベントを受け取ると、新しく組み立てたレスポンスをクライアントへ返します。Worker はオリジンサーバーへ進まず、Cloudflare のグローバルネットワーク ↗ から直接新しいレスポンスを返します。通常のサーバーはリクエストを受けてレスポンスを返します。Cloudflare Workers では、Cloudflare のグローバルネットワーク上でレスポンスを組み立てるので、すばやく応答できます。
Cloudflare Workers に公開するプロジェクトでは、ES モジュール、npm パッケージ、async / await ↗ 関数など、モダンな JavaScript のツールを使ってアプリケーションを作れます。Workers を書くだけでなく、このチュートリアルと同じツールと手順で 本格的なアプリケーションを構築 できます。
このチュートリアルで作る QR コードジェネレーターは、1 つのルートで動き、リクエストを受け取る Worker です。各リクエストにはテキストメッセージ(たとえば URL)が含まれ、関数がそのテキストを QR コードへエンコードします。関数は、QR コードを PNG 画像形式で返します。
この時点では、Worker 関数はリクエストを受け取り、テキスト "Hello Worker!" の簡単なレスポンスを返せます。Worker に入ってくるデータを扱うため、受信リクエストが POST かどうかを確認します。
export default {
async fetch(request, env, ctx) {
if (request.method === "POST") {
return new Response("Hello Worker!");
}
},
};現状、受信リクエストが POST でない場合、関数は undefined を返します。ただし Worker は常に Response を返す必要があります。関数は受信した POST リクエストだけを受け付けるので、POST でない場合は 405 ステータスコード ↗ の新しい Response を返します。
export default {
async fetch(request, env, ctx) {
if (request.method === "POST") {
return new Response("Hello Worker!");
}
return new Response("Expected POST request", {
status: 405,
});
},
};リクエストの基本的な流れができました。次は、有効な受信リクエストへのレスポンスを用意します。POST リクエストが来たら、関数は QR コードを生成します。まず "Hello Worker!" のレスポンスを、最終的に関数の中心になる新しい関数 generateQRCode へ移します。
export default {
async fetch(request, env, ctx) {
if (request.method === "POST") {
}
},
};
async function generateQRCode(request) {
// TODO: Include QR code generation
return new Response("Hello worker!");
}generateQRCode 関数を埋めたら、fetch 関数内で呼び出し、その結果をクライアントへ直接返します。
export default {
async fetch(request, env, ctx) {
if (request.method === "POST") {
return generateQRCode(request);
}
},
};Cloudflare Workers にデプロイするプロジェクトは、すべて npm パッケージに対応しています。そのため、Worker の機能をすばやく組み立てられます。'qrcode-svg' ↗ パッケージは、テキストを受け取って QR コードへエンコードするのに便利です。コマンドラインで 'qrcode-svg' をインストールし、プロジェクトの 'package.json' に保存します。
npm i qrcode-svgyarn add qrcode-svgpnpm add qrcode-svgbun add qrcode-svgindex.js で、qrcode-svg パッケージを変数 QRCode としてインポートします。generateQRCode 関数では、request.json で受信リクエストを JSON として解析し、qrcode-svg パッケージで新しい QR コードを生成します。QR コードは SVG として生成されます。SVG データを本文にし、Content-Type ヘッダーを image/svg+xml にした新しい Response を組み立てます。これで、ブラウザーは Worker から返るデータを画像として正しく解析できます。
import QRCode from "qrcode-svg";
async function generateQRCode(request) {
const { text } = await request.json();
const qr = new QRCode({ content: text || "https://workers.dev" });
return new Response(qr.svg(), {
headers: { "Content-Type": "image/svg+xml" },
});
}ユーザーがルートへ POST リクエストを送ると Worker が実行されます。ただし、関数をテストするための適切な画面も用意するのがよいです。この時点では、POST 以外のリクエストを関数が受け取ると 405 レスポンスを返します。新しい fetch では、405 エラーの代わりに静的な HTML ドキュメントを含む新しい Response を返します。
export default {
async fetch(request, env, ctx) {
if (request.method === "POST") {
return generateQRCode(request);
}
return new Response(landing, {
headers: {
"Content-Type": "text/html",
},
});
},
};
async function generateQRCode(request) {
const { text } = await request.json();
const qr = new QRCode({ content: text || "https://workers.dev" });
return new Response(qr.svg(), {
headers: { "Content-Type": "image/svg+xml" },
});
}
const landing = `
<h1>QR Generator</h1>
<p>Click the below button to generate a new QR code. This will make a request to your Worker.</p>
<input type="text" id="text" value="https://workers.dev"></input>
<button onclick="generate()">Generate QR Code</button>
<p>Generated QR Code Image</p>
<img id="qr" src="#" />
<script>
function generate() {
fetch(window.location.pathname, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text: document.querySelector("#text").value })
})
.then(response => response.blob())
.then(blob => {
const reader = new FileReader();
reader.onloadend = function () {
document.querySelector("#qr").src = reader.result; // Update the image source with the newly generated QR code
}
reader.readAsDataURL(blob);
})
}
</script>
`;静的な HTML 文字列である landing 変数は、input タグと、対応する button を用意します。ボタンは generateQRCode 関数を呼びます。この関数は Worker へ HTTP POST リクエストを送り、ページ上に返ってきた QR コード画像を表示できます。
以上の手順が終わると、Worker の準備は完了です。完成版のコードは次のとおりです。
const QRCode = require("qrcode-svg");
export default {
async fetch(request, env, ctx) {
if (request.method === "POST") {
return generateQRCode(request);
}
return new Response(landing, {
headers: {
"Content-Type": "text/html",
},
});
},
};
async function generateQRCode(request) {
const { text } = await request.json();
const qr = new QRCode({ content: text || "https://workers.dev" });
return new Response(qr.svg(), {
headers: { "Content-Type": "image/svg+xml" },
});
}
const landing = `
<h1>QR Generator</h1>
<p>Click the below button to generate a new QR code. This will make a request to your Worker.</p>
<input type="text" id="text" value="https://workers.dev"></input>
<button onclick="generate()">Generate QR Code</button>
<p>Generated QR Code Image</p>
<img id="qr" src="#" />
<script>
function generate() {
fetch(window.location.pathname, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ text: document.querySelector("#text").value })
})
.then(response => response.blob())
.then(blob => {
const reader = new FileReader();
reader.onloadend = function () {
document.querySelector("#qr").src = reader.result; // Update the image source with the newly generated QR code
}
reader.readAsDataURL(blob);
})
}
</script>
`;以上の手順で、Cloudflare Workers 上の QR コードジェネレーターのコードを書き終えました。
Wrangler には、Cloudflare Workers アプリケーションのバンドル、アップロード、リリースが組み込まれています。npx wrangler deploy を実行すると、コードをビルドしてデプロイします。
npx wrangler deployこのチュートリアルでは、QR コードを生成する Worker アプリケーションを構築してデプロイしました。このアプリケーションのソースコード全体は GitHub ↗ で確認できます。
自分のプロジェクトを始めたい場合は、既存の クイックスタートテンプレート を確認してください。