如何阻止在Encore.ts中对所有服务执行初始化函数?

前端开发 2026-07-11

我有一个Encore.ts应用,包含多个服务,每个服务都有各自的初始化逻辑。当部署到GCP时(每个服务在一个独立的容器中),所有服务的初始化函数会在每一个容器中运行——不仅仅是该容器应托管的服务的初始化函数。

例如,使用 serviceAserviceB 时,serviceA 容器的日志会同时显示 “Service A已初始化” 和 “Service B已初始化”。之所以会这样,是因为所有服务都被打包在同一个JavaScript包中。

// serviceA/index.ts
function initServiceA() {
  console.log("Service A initialized");
}
initServiceA();

// serviceB/index.ts
function initServiceB() {
  console.log("Service B initialized");
}
initServiceB();

如何确保每个服务的初始化代码仅在它自己的容器中运行?

解决方案

这是预期行为,原因在于Encore.ts打包JavaScript的方式——所有服务的代码都被打包在一个包中,尽管每个容器实际只托管一个服务。要有条件地执行初始化代码,可以使用来自 encore.dev 包的 appMeta() 来检查当前容器托管的是哪个服务。

appMeta() 函数返回关于正在运行的应用程序的元数据,其中包括当前容器中托管的服务列表。你可以使用一个检查来对初始化逻辑进行保护:

import { appMeta } from "encore.dev";

const meta = appMeta();
if (meta.hostedServices.includes("serviceA")) {
  initServiceA();
}

之所以有效,是因为尽管JavaScript包包含所有服务的代码,appMeta().hostedServices 只列出当前容器中实际在运行的服务。在大多数部署配置中,每个容器通常只托管一个服务,因此这会将初始化代码有效地限制在正确的容器中。

相关文档:

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章