使用'use server'指令后服务器文件仍暴露至客户端的问题求助
问题分析与解决方法
问题根源
你这问题出在顶级await上——直接在模块顶层执行await oracledb.getConnection(...),哪怕加了"use server"指令,Next.js也会因为这个顶级异步操作,把整个文件打包到客户端,导致数据库凭证暴露。
解决方案
1. 把数据库连接逻辑移到服务器动作函数内部
避免在模块顶层执行异步操作,将连接逻辑放到导出的异步函数里,同时记得操作完成后关闭连接,防止资源泄漏:
"use server"; import { productListSorter } from "@/util/utility"; import oracledb from "oracledb"; export const getAllProducts = async () => { // 将连接逻辑移至函数内部 const connect = await oracledb.getConnection({ user: "student", password: "studentpassword", connectString: "localhost:1521/XEPDB1", }); const products = await connect.execute(`SELECT * FROM products`); // 关闭数据库连接 await connect.close(); return productListSorter(products.rows); };
2. 用连接池复用连接(可选)
如果需要复用数据库连接,不要用顶级await初始化,改用延迟初始化的函数:
"use server"; import { productListSorter } from "@/util/utility"; import oracledb from "oracledb"; let connectionPool; async function initPool() { if (!connectionPool) { connectionPool = await oracledb.createPool({ user: "student", password: "studentpassword", connectString: "localhost:1521/XEPDB1", }); } return connectionPool; } export const getAllProducts = async () => { const pool = await initPool(); const connect = await pool.getConnection(); const products = await connect.execute(`SELECT * FROM products`); await connect.close(); return productListSorter(products.rows); };
3. 检查文件引用关系
确认这个文件没有被客户端组件(带"use client"指令的组件)直接或间接导入。服务器专用文件只能被服务器组件、API路由或其他服务器端代码引用。
内容的提问来源于stack exchange,提问作者Lakshay Manchanda
相关产品推荐
相关产品推荐

