gpt4 book ai didi

node.js - 您可以在 Next.js API 中保持 PostgreSQL 连接处于事件状态吗?

转载 作者:行者123 更新时间:2023-12-04 08:51:14 27 4
gpt4 key购买 nike

我正在为我的副项目使用 Next.js。我有一个托管在 ElephantSQL 上的 PostrgeSQL 数据库。在 Next.js 项目中,我使用 apollo-server-micro 包设置了 GraphQL API。
在设置 GraphQL API 的文件 (/api/graphql) 中,我导入了一个数据库助手模块。在其中,我建立了一个池连接并导出了一个函数,该函数使用池中的客户端执行查询并返回结果。这看起来像这样:

// import node-postgres module
import { Pool } from 'pg'

// set up pool connection using environment variables with a maximum of three active clients at a time
const pool = new Pool({ max: 3 })

// query function which uses next available client to execute a single query and return results on success
export async function queryPool(query) {
let payload

// checkout a client
try {
// try executing queries
const res = await pool.query(query)
payload = res.rows
} catch (e) {
console.error(e)
}

return payload
}
我遇到的问题是,看起来 Next.js API 并没有(总是)保持连接事件,而是打开了一个新的连接(对于每个连接的用户,甚至可能对于每个 API 查询) ,这会导致数据库快速耗尽连接。
我相信我想要实现的目标是可能的,例如在 AWS Lambda 中(通过将 context.callbackWaitsForEmptyEventLoop 设置为 false)。
我很可能对无服务器功能的工作方式没有正确的理解,这可能根本不可能,但也许有人可以建议我一个解决方案。
我找到了一个名为 的包无服务器-postgres 我想知道这是否能够解决它,但我更喜欢使用 node-postgres 包,因为它有更好的文档。另一种选择可能是完全放弃集成的 API 功能并构建一个专用的后端服务器,它维护数据库连接,但显然这将是最后的手段。

最佳答案

我还没有对此进行压力测试,但似乎 mongodb next.js example , 通过将数据库连接附加到 global 来解决此问题在辅助函数中。他们示例中的重要部分是here .
由于pg连接比 mongodb 更抽象一点,看来这种方法对我们来说只需要几行pg爱好者:

// eg, lib/db.js


const { Pool } = require("pg");

if (!global.db) {
global.db = { pool: null };
}

export function connectToDatabase() {
if (!global.db.pool) {
console.log("No pool available, creating new pool.");
global.db.pool = new Pool();
}
return global.db;
}
然后在例如我们的 API 路由中,我们可以:
// eg, pages/api/now


export default async (req, res) => {
const { pool } = connectToDatabase();
try {
const time = (await pool.query("SELECT NOW()")).rows[0].now;
res.end(`time: ${time}`);
} catch (e) {
console.error(e);
res.status(500).end("Error");
}
};

关于node.js - 您可以在 Next.js API 中保持 PostgreSQL 连接处于事件状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64093560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com