Nlea
Nlea
Explore posts from servers
CDCloudflare Developers
Created by Nlea on 11/14/2024 in #workers-help
How to access environment variables in Cloudflare Workers when using RPC binding
I'm working with two separate Cloudflare Workers, where Worker A calls a function in Worker B via a binding (RPC). Worker B requires an environment variable to send an email, and this variable should be scoped to Worker B itself, so it doesn't depend on Worker A's environment. Here's the relevant code for Worker B:
export class WorkerEmail extends WorkerEntrypoint {
// Currently, entrypoints without a named handler are not supported

async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/send" && request.method === "POST") {
const { email, firstName }: { email: string; firstName: string } =
await request.json();
return this.send(email, firstName, this.env as Env); // Attempting to pass env here
}
return new Response(null, { status: 404 });
}


async send(email: string, firstName: string, env: Env): Promise<Response> {
const resend = new Resend(env.RESEND_API); // env.RESEND_API should come from Worker B's environment

}
}
export class WorkerEmail extends WorkerEntrypoint {
// Currently, entrypoints without a named handler are not supported

async fetch(request: Request): Promise<Response> {
const url = new URL(request.url);
if (url.pathname === "/send" && request.method === "POST") {
const { email, firstName }: { email: string; firstName: string } =
await request.json();
return this.send(email, firstName, this.env as Env); // Attempting to pass env here
}
return new Response(null, { status: 404 });
}


async send(email: string, firstName: string, env: Env): Promise<Response> {
const resend = new Resend(env.RESEND_API); // env.RESEND_API should come from Worker B's environment

}
}
When I use HTTP with fetch in Worker A, it works fine:
await c.env.WORKER_EMAIL.fetch(
new Request("https://worker-email/send", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, firstName }),
})
);
await c.env.WORKER_EMAIL.fetch(
new Request("https://worker-email/send", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email, firstName }),
})
);
However, if I want to call Worker B directly via an RPC-style binding (like await c.env.WORKER_EMAIL.send(email, firstName)), I run into issues with accessing the environment variable env.RESEND_API directly in Worker B. It seems the environment is not properly scoped when using RPC and it stays undefined Question: How can I pass the correct environment to Worker B's send function when using RPC? Or is there a better way to structure this to ensure Worker B can access its own environment variables independently of Worker A? What am I missing here? Any guidance would be greatly appreciated!
2 replies