在服务器中间件中建立数据库连接

问题描述 投票:0回答:2

我正在学习使用 Nuxt,目前正在尝试使用 nuxt-bridge,它带有大多数 Nuxt3 功能,同时保持我需要的 nuxt-auth-next 模块的兼容性。 截至目前,我正在使用 Nuxt3

/server/api
/server/middleware
目录开发我的 API。一切都在
nuxi/nitro
上运行。

这是 API 路由的一个小示例(

/server/api/me.get.ts
:从 JWT 令牌获取用户信息,代码已在此简化):

// /server/api/me.get.ts
import mysql, { RowDataPacket } from 'mysql2/promise'
import { defineEventHandler, getRequestHeader } from 'h3' // Needed since nuxt-bridge wont auto import dependencies in /server/...
import { useRuntimeConfig } from '#imports' // fails but code still works... ESM absolute path needed

export default defineEventHandler(async (event) => {
  const config = useRuntimeConfig()

  try {
    const db = await mysql.createPool(config.mysql)
    // ... Core route logic : getting user info from token and sending it back
  } catch (e) {
    // Managing error
}
})

这实际上按预期“有效”。我的问题是,我使用相同的代码在每个路由中建立MySQL连接login.post.ts

register.post.ts
...),这是多余的并且不太优雅。 然后我想使用服务器中间件为每个路由建立连接。
首先,这是服务器中间件的正确做法/使用吗?
然后,我很难找到

如何正确实现它

。我创建了一个 /server/middleware/database.ts,每次进行 API 调用时都会触发它。但我不知道如何从中建立 mysql 连接并将其传递给实际调用的路由。 我尝试按如下方式摆弄请求/响应(在教程中看到):

// /server/middleware/database.ts
import type { IncomingMessage, ServerResponse } from 'http'
import mysql from 'mysql2/promise'
import { defineHandler } from 'h3' // Needed since nuxt-bridge wont auto import dependencies
import { useRuntimeConfig } from '#imports' // fails but code still works... ESM absolute path needed

export default defineHandler(
  async (req: IncomingMessage, res: ServerResponse) => {
    const config = useRuntimeConfig()

    try {
      req['db'] = await mysql.createPool(config.mysql)
    } catch (e) {
      console.log('error')
    }
  }
)

然后像这样使用它:

// /server/api/test.get.ts import type { IncomingMessage, ServerResponse } from 'http' import { defineHandler } from 'h3' // Needed since nuxt-bridge wont auto import dependencies import { useRuntimeConfig } from '#imports' // fails but code still works... ESM absolute path needed export default defineHandler( async (req: IncomingMessage, res: ServerResponse) => { const [test] = req['db'].query('SELECT * FROM users') // Core logic } )

但这不起作用。我被困住了:)。
请注意,自从我使用 Javascript 以来已经有一段时间了,这是我使用 Typescript 的第一步。

任何帮助将不胜感激。

middleware nuxtjs3 nuxt-bridge
2个回答
0
投票

//server/plugins/connectDb.js export default defineNitroPlugin(() => { //your code... })

https://nuxt.com/docs/guide/directory-struct/server#server-plugins

这是一个更详细的例子

// sever/db/index.js import { drizzle } from "drizzle-orm/node-postgres"; import Client from "pg/lib/client.js"; const client = new Client({ host: "127.0.0.1", port: 5432, user: "postgres", password: "1111", database: "abc", }); let db; const connectDB = async () => { if (db) return db; try { await client.connect(); console.log("Connected successfully to server"); db = drizzle(client); return db; } catch (error) { console.error(error); } } export { connectDB, db }

// server/plugins/connectDb.js
import { connectDB } from 'server/db/index.js';

export default defineNitroPlugin(async (nitroApp) => {
  await connectDB();
})


-1
投票

创建文件/server/middleware/database.ts

import mysql from 'mysql2/promise' export default defineEventHandler(async (event) => { event.context.db = await mysql.createConnection({ host: '127.0.0.1', port: 3306, user: 'root', password: 'xxxx', database: 'STATS' }) });

还有 api 端点:

export default defineEventHandler(async (event) => { const [rows, fields] = await event.context.db.execute('select * from tests'); return { rows, fields } })

希望它能解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.