Node.js 能否在Next.js API中保持PostgreSQL连接的活动状态?

Node.js 能否在Next.js API中保持PostgreSQL连接的活动状态?,node.js,postgresql,next.js,serverless,node-postgres,Node.js,Postgresql,Next.js,Serverless,Node Postgres,我正在使用Next.js作为我的辅助项目。我在ElephantSQL上有一个PostrgeSQL数据库。在Next.js项目中,我使用apollo服务器微包设置了一个GraphQL API 在设置graphqlapi的文件(/API/GraphQL)中,我导入了一个数据库帮助器模块。在这里面,我建立了一个池连接并导出了一个函数,该函数使用池中的一个客户机来执行查询并返回结果。这看起来像这样: // import node-postgres module import { Pool } from

我正在使用Next.js作为我的辅助项目。我在ElephantSQL上有一个PostrgeSQL数据库。在Next.js项目中,我使用apollo服务器微包设置了一个GraphQL API

在设置graphqlapi的文件(/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.callbackhaitsforemptyeventloop设置为false)

很可能我对无服务器函数的工作原理没有正确的理解,这可能根本不可能,但也许有人可以给我建议一个解决方案


我发现了一个名为无服务器postgres的包,我想知道这是否能够解决这个问题,但我更喜欢使用node postgres包,因为它有更好的文档。另一种选择可能是完全脱离集成的API功能,构建一个专用的后端服务器,以维护数据库连接,但显然这将是最后的手段。

我还没有对此进行压力测试,但似乎,通过在助手函数中将数据库连接附加到
global
,解决了此问题。他们例子中最重要的一点是

由于
pg
连接比
mongodb
更为抽象,因此对于我们
pg
爱好者来说,这种方法似乎只需要几行代码:

//例如,lib/db.js
const{Pool}=require(“pg”);
如果(!global.db){
global.db={pool:null};
}
导出函数connectToDatabase(){
如果(!global.db.pool){
log(“没有可用的池,正在创建新池”);
global.db.pool=新池();
}
返回global.db;
}
然后,例如,在我们的API路线中,我们可以:

//例如,pages/api/now
导出默认异步(req,res)=>{
const{pool}=connectToDatabase();
试一试{
常量时间=(wait pool.query(“现在选择()”))。行[0]。现在;
res.end(`time:${time}`);
}捕获(e){
控制台错误(e);
资源状态(500)。结束(“错误”);
}
};

好问题,有好的解决方案吗?Br@user1665355不幸的是,没有。有一个mysql无服务器模块,应该可以解决mysql数据库连接的这个问题,但不幸的是,没有类似的模块可用于Postgres。我真的希望将来有人会创建一个,但在此之前,我们必须使用第二个专用的db连接服务器。