如何访问 Keystone 6 中的底层 Express 应用程序?

How to access underlying express app in Keystone 6?

我正在为我的后端使用 Keystone 6,我正在尝试集成 Stripe,这需要访问底层 Express 应用程序以将客户端机密从服务器传递给客户端。这在此处的 Stripe 文档中突出显示:https://stripe.com/docs/payments/payment-intents#passing-to-client

虽然我无法弄清楚如何访问 Keystone 6 中的快捷应用程序,但他们似乎没有在文档中提及任何相关内容。任何帮助将不胜感激。

简短的回答是 Keystone 6 还不支持这个。

较长的答案分为两部分:

此功能即将推出

我们一直在内部讨论这个要求,并且已经提高了它的优先级。我们将在下周更新 public 路线图以反映这一点。 功能本身应该很快就会到来。 (很遗憾,我无法确定发布日期。)

可以访问 Express 应用程序,但现在真的很痛苦

如果您查看 Keystone 的 start 命令,您可以看到它在哪里 calls createExpressServer()。 这只是 returns 一个带有 GraphQL API 和其他一些小细节的快速应用程序。 但实际上没有什么强制您使用 keystone start 命令中的构建 – 您可以复制此代码,对其进行破解,然后直接 运行 自己直接使用。

例如。你可以替换这个...

const server = await createExpressServer(
  config,
  graphQLSchema,
  keystone.createContext,
  false,
  getAdminPath(cwd)
);

有...

const server = express();
server.get('/hello-world', (req, res) => {
  res.send('Hello');
});

const keystoneServer = await createExpressServer(
  config,
  graphQLSchema,
  keystone.createContext,
  false,
  getAdminPath(cwd)
);
server.use(keystoneServer);

并且您的 /hello-world 端点应优先于 Keystone 添加的内容。

不幸的是,这对 dev 命令不起作用,因此,在您的本地环境中,您需要以不同的方式执行此操作。

一个选项是启动您控制的第二个快速服务器并将其放在不同的端口并在那里包含您的自定义路由。 您仍然可以在 Keystone 应用程序代码库中执行此操作,但在不同环境中使用不同的 URL 可能会很烦人。 您可能只需要一个环境变量来用于您的自定义端点 URL,在生产环境中使用如下值:

# Production
GRAPHQL_ENDPOINT="https://api.example.com/api/graphql"
CUSTOM_ENDPOINT="https://api.example.com/hello-world"

这在开发中:

# Dev
GRAPHQL_ENDPOINT="http://localhost:3000/api/graphql"
CUSTOM_ENDPOINT="http://localhost:3100/hello-world"

虽然丑陋,但确实有效。

我会在“官方”功能登陆时更新此答案。