Luc*_*ons 5 middleware nuxt-bridge nuxtjs3
我正在学习使用 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
}
})
Run Code Online (Sandbox Code Playgroud)
这实际上按预期工作。我的问题是,我在每个路由(, ...)中使用相同的代码建立MySQL连接,这是多余的并且不太优雅。然后我想使用服务器中间件为每个路由建立连接。
首先,这是 serverMiddleware 的正确做法/使用吗?login.post.tsregister.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')
}
}
)
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
// /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
}
)
Run Code Online (Sandbox Code Playgroud)
但这不起作用。我被困住了:)。请注意,自从我使用 Javascript 以来已经有一段时间了,这是我使用 Typescript 的第一步。
任何帮助将不胜感激。
小智 -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'
})
});
Run Code Online (Sandbox Code Playgroud)
以及 api 端点:
export default defineEventHandler(async (event) => {
const [rows, fields] = await event.context.db.execute('select * from tests');
return {
rows,
fields
}
})
Run Code Online (Sandbox Code Playgroud)
我希望它能解决你的问题。