Как обрабатывать Postgres пул соединений в бессерверных функциях Zeit Now v2? - PullRequest
2 голосов
/ 09 февраля 2020

У меня есть небольшое веб-приложение для хобби, построенное на этом шаблоне: https://github.com/tomsoderlund/nextjs-pwa-graphql-sql-boilerplate

Оно использует бесплатный уровень ElephantSQL (5 подключений), работает на бессерверных функциях Zeit Now v2 - и сохраняет из-за Postgres соединений (« слишком много соединений для роли« djsktctf »»).

Я использую death NPM для закрытия соединений - это в /api/graphql/index.js:

const { ApolloServer, gql } = require('apollo-server-micro')
const { config } = require('../../config/config')

// Postgres (pg)
const { Pool } = require('pg')
const onProcessDeath = require('death')
const pool = new Pool({ connectionString: config.databaseUrl })
let client

const initDatabaseClient = async () => {
  if (!client) client = await pool.connect()
}
initDatabaseClient()

onProcessDeath((signal, err) => {
  client && client.release()
})

const typeDefs = gql`
  ${require('../../graphql/font/schema')}
`

const resolvers = {
  ...require('../../graphql/font/resolvers')(pool)
}

const server = new ApolloServer({
  typeDefs,
  resolvers,
  introspection: true,
  playground: true
})

module.exports = server.createHandler({ path: config.graphqlPath })

Тогда внутри resolvers это выглядит так:

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

Как можно улучшить это, чтобы избежать исчерпания соединений?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...