基于Deno与Express的Apollo Server如何实现优雅关闭?
在Deno中实现Apollo Server的优雅关闭
在Deno环境下使用Apollo Server时,直接调用server.stop()是核心操作,但还需要结合Deno的信号监听来完成完整的优雅关闭流程,具体实现步骤如下:
- 启动Apollo Server后,监听Deno的终止信号(如
SIGINT、SIGTERM) - 当收到终止信号时,调用
server.stop()——该方法会自动停止接收新请求,并等待正在处理的请求完成后再关闭服务 - 在
server.stop()的Promise完成后,退出Deno进程
示例代码如下:
import { ApolloServer } from "@apollo/server"; import { startStandaloneServer } from "@apollo/server/standalone"; const server = new ApolloServer({ typeDefs, resolvers, }); const { url } = await startStandaloneServer(server, { listen: { port: 4000 }, }); console.log(`🚀 Server ready at ${url}`); // 监听终止信号,触发优雅关闭 for (const signal of ["SIGINT", "SIGTERM"] as const) { Deno.addSignalListener(signal, async () => { console.log(`收到${signal}信号,开始优雅关闭服务器...`); await server.stop(); console.log("服务器已优雅关闭"); Deno.exit(0); }); }
需要注意:
server.stop()本身已经封装了等待正在处理的请求完成的逻辑,无需额外实现类似Node.js中ApolloServerPluginDrainHttpServer插件的请求排空功能- 必须手动监听信号并触发
server.stop(),否则进程可能被强制终止,导致正在处理的请求中断
内容的提问来源于stack exchange,提问作者Mix Master Mike
相关产品推荐
相关产品推荐

