如何在 Vercel 无服务器函数中处理 Postgres 连接池?(“角色的连接太多”)

Tom*_*und 5 postgresql apollo next.js vercel

我有一个基于此模板构建的小型爱好网络应用程序:https ://github.com/tomsoderlund/nextjs-pwa-graphql-sql-boilerplate

\n

它使用 ElephantSQL\xe2\x80\x99s 免费层(5 个连接),在 Zeit Now v2 无服务器函数 \xe2\x80\x93 上运行,并不断耗尽 Postgres 连接(\xe2\x80\x9c角色“djsktctf 的连接过多”) “ \xe2\x80\x9d)。

\n

I\xe2\x80\x99m 使用deathNPM 关闭连接 - 位于/api/graphql/index.js

\n
const { ApolloServer, gql } = require(\'apollo-server-micro\')\nconst { config } = require(\'../../config/config\')\n\n// Postgres (pg)\nconst { Pool } = require(\'pg\')\nconst onProcessDeath = require(\'death\')\nconst pool = new Pool({ connectionString: config.databaseUrl })\nlet client\n\nconst initDatabaseClient = async () => {\n  if (!client) client = await pool.connect()\n}\ninitDatabaseClient()\n\nonProcessDeath((signal, err) => {\n  client && client.release()\n})\n\nconst typeDefs = gql`\n  ${require(\'../../graphql/font/schema\')}\n`\n\nconst resolvers = {\n  ...require(\'../../graphql/font/resolvers\')(pool)\n}\n\nconst server = new ApolloServer({\n  typeDefs,\n  resolvers,\n  introspection: true,\n  playground: true\n})\n\nmodule.exports = server.createHandler({ path: config.graphqlPath })\n
Run Code Online (Sandbox Code Playgroud)\n

然后里面resolvers是这样的:

\n
module.exports = (pool) => ({\n  Query: {\n    async articles (parent, variables, context, info) {\n      const sqlString = `SELECT * FROM article LIMIT 100;`\n      const { rows } = await pool.query(sqlString)\n      return rows\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我该如何改进以避免连接耗尽?

\n

更新

\n

得到下面的答案后,我使用client.end()而不是使用共享客户端更新了我的代码:

\n
// const results = await runDatabaseFunction(async (pool) => { ... })\nconst runDatabaseFunction = async function (functionToRun) {\n  // Connect db\n  const client = await pool.connect()\n  // Run function\n  const results = await functionToRun(client)\n  // Release db\n  await client.end()\n  await client.release()\n  return results\n}\n
Run Code Online (Sandbox Code Playgroud)\n

lup*_*pin 2

我认为这个问题来自于 client = await pool.connect()

它似乎保存着你的数据库。所以你需要断开你和数据库之间的连接。
如果您await client.end()在上次获取数据后添加,则错误可能会消失。

就我而言,这种方式解决了问题。