如何在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
相关产品推荐
相关产品推荐

