JavaScript Mapping Library
I’ll warn you ahead of time and say this post isn’t too much more than what you can find in the documentation, but I wanted to see it work for myself so I had to setup a test locally. Cloudflare Service bindings are a way for one Worker to connect to another. That seems simple enough, but while it defines a "connection", that connection is completely internal to the Cloudflare environment. I.e., incredibly fast with much lower latency. Let’s consider a simple example.
I began by creating a worker, named backworker, with just a simple message:
backworker
export default { async fetch(request, env, ctx) { return new Response('Hello from Backworker'); },};
I struggled with what to call that header, "front end" felt like a loaded term as it implies HTML, etc. Anyway, I made a second worker named frontworker. In order to "connect" it to the back, you need to edit your wrangler.toml:
frontworker
wrangler.toml
services = [ { binding = "backlogic", service = "backworker" }]
Two things to note here. The service value points to the name of the worker where the binding is how you will address it. I suppose normally you would make these the same. I chose a different name just so I could ensure it worked properly.
service
In order for this worker to communicate with the other, you use the env object and binding name in your code. Here’s how it looks:
env
export default { async fetch(request, env, ctx) { const backResponse = await env.backlogic.fetch(request.clone()); let resp = await backResponse.text(); return new Response(`Hello from front, back said: $ {resp}`); },};
You use fetch to communicate, which is a network call, but remember this is going to be internal only. It does need a request object which can only be read once, hence the use of request.clone(). As I didn’t bother changing my other service to return JSON, I just get the text response and include it in the response here.
fetch
request.clone()
When working locally, you will need to have both workers running. While I wasn’t sure it was required, I ensured I started backworker first, and then frontworker. The CLI noted the binding:
Opening it up and running gives you what you expect:
Hello from front, back said: Hello from Backworker
That’s mostly it, but there’s one more cool aspect. If my intent is for backworker to never be used by itself, I can actually disable its route in the dashboard:
Now the worker is no longer available publicly, but the front one works just fine: https://frontworker.raymondcamden.workers.dev/
If you would like to test this yourself, you can clone the two workers from my new demo repository here: https://github.com/cfjedimaster/cloudflareworkers-demos
Photo by Patrick Wittke on Unsplash
Raymond Camden
You must be logged in to post a comment.
This site uses Akismet to reduce spam. Learn how your comment data is processed.