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

使用'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:27:19