You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Server Plugin中配置PostgreSQL连接并全局调用

解决Nitro中全局使用pg-promise数据库连接的问题

问题根源

你之前的代码里,db要么是局部变量无法被外部访问,要么通过导出变量的方式存在初始化顺序问题——API可能在插件完成数据库连接前就尝试访问db,导致未定义。

正确实现方案

利用Nitro插件的nitroApp实例,将数据库连接挂载到全局实例或请求上下文,确保API能可靠获取有效连接:

1. 修改数据库连接插件 ~/server/plugins/connectdb.ts

import pgPromise from 'pg-promise'

export default defineNitroPlugin((nitroApp) => {
    console.log('Initializing DB connection')
    const pgp = pgPromise({})
    try {       
        const db = pgp('postgres://user:pwd@localhost:5432/mydb')
        // 方式1:挂载到nitroApp全局实例
        nitroApp.db = db
        // 方式2:挂载到请求上下文,方便在event中直接获取
        nitroApp.hooks.hook('request', (event) => {
            event.context.db = db
        })
    } catch (error) {
        console.error("Error: "+error);
        process.exit(1) 
    }
})

2. 在API中调用数据库连接

方式一:从请求上下文获取
export default defineEventHandler((event) => {
    const db = event.context.db
    console.log(db);
    // 示例查询
    // return db.any('SELECT * FROM your_table')
})
方式二:从nitroApp全局实例获取
import { useNitroApp } from 'nitropack'

export default defineEventHandler(() => {
    const nitroApp = useNitroApp()
    const db = nitroApp.db
    console.log(db);
})

原方案失效原因

  • 最初的const db是try代码块的局部变量,外部作用域无法访问;
  • 导出let db的方式存在时序问题:API路由可能在插件完成数据库连接前就加载,此时db仍为undefined;
  • 挂载到nitroApp实例是Nitro官方推荐的全局资源共享方式,能确保插件初始化完成后,API才能获取到有效连接。

内容的提问来源于stack exchange,提问作者JC Boggio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 14:13:30