🛠【實戰排除教學】從 VS Code 的 _logger 錯誤,到 PowerShell 找不到 npm/serve,再到 Oracle ORA-03135 連線中斷——一次搞懂!

 

前言

這篇文章把你在實務中可能一次遇到的三類問題整合成一篇易懂、可照做的排錯筆記:

  1. C# / EF Core:VS Code 顯示 CS0103: The name '_logger' does not exist

  2. 前端部署預覽:PowerShell 說找不到 serve、更慘的是連 npmnode 也找不到

  3. Oracle 連線中斷:API 查詢跑一陣子後直接噴 ORA-03135: connection lost contact

我會用工程師口吻、但寫給不熟悉的人也看得懂的方式,帶你一步步修好。




一、VS Code:_logger 不存在(CS0103)

問題現象

catch 裡面呼叫 _logger.LogError(...),卻出現:

CS0103: The name '_logger' does not exist in the current context

代表類別裡沒有宣告或注入 _logger

正確作法:在類別中注入 Logger

  1. 類別欄位

using Microsoft.Extensions.Logging;

public class ApsDataProcessor
{
    private readonly AppDbContext _context;
    private readonly ILogger _logger;

    public ApsDataProcessor(AppDbContext context, ILogger logger)
    {
        _context = context;
        _logger = logger;
    }

    public async Task> GetDataByVersionA(string version)
    {
        try
        {
            // ... your logic
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "GetDataByVersionA 發生錯誤");
            return new List();
        }
    }
}
  1. 確保 DI 容器(ASP.NET Core)已註冊 AppDbContext 與 logging(預設已有)。

小重點:沒有注入就叫不到,這是依賴注入(DI)的基本觀念。




二、PowerShell:serve / npm / node 都找不到

問題現象

  • serve : 無法辨識 'serve'

  • npm : 無法辨識 'npm'

  • node : 無法辨識 'node'

這代表你的電腦沒有裝 Node.js(因此也沒有 npm),或是 PATH 沒有加入 Node.js 路徑

方案 A:全新安裝 Node.js(含 npm)

  1. 下載 LTS 版本(長期維護版):打開瀏覽器 → 前往 nodejs.org

  2. 執行 .msi 安裝檔,記得勾選 “Add to PATH”

  3. 安裝完重開 PowerShell,確認版本:

    node -v
    npm -v
    

方案 B:已安裝但 PATH 遺失

控制台 → 系統 → 進階系統設定 → 環境變數 → 系統變數 Path,新增:

C:\Program Files\nodejs\

儲存後重開 PowerShell,再測一次 node -vnpm -v

安裝靜態伺服器 serve

npm install -g serve

在你的打包資料夾執行(例如 dist-20250724T1147):

serve -s dist-20250724T1147

或先 cd dist-20250724T1147 後直接 serve

小重點serve 是快速預覽打包後前端的工具,非常適合本機或臨時環境驗收。




三、Oracle:ORA-03135: connection lost contact

問題現象

API 查資料跑了約 19 秒後失敗,log 顯示:

ORA-03135: connection lost contact
遠端主機已強制關閉一個現存的連線

常見原因有二:

  • 連線閒置或查詢太久 → 被 Oracle / 防火牆 / 反向代理切斷

  • 一次抓太多資料 → EF Core 還沒拉完就被斷

快速檢查清單

  • 查 Oracle server sqlnet.ora 是否設了嚴格 timeout(例如 SQLNET.INBOUND_CONNECT_TIMEOUT=60

  • 雲端 / 防火牆是否有 TCP idle timeout(例如 5 分鐘)

  • Kestrel / 反向代理(IIS/Nginx)Keep-Alive 是否太短

  • 你的查詢是否一次拉爆量(沒分頁、沒必要的欄位)

實務解法

1) 連線字串加 Timeout(client 端)

appsettings.json

"ConnectionStrings": {
  "DefaultConnection": "User Id=xxx;Password=xxx;Data Source=xxx;Connection Timeout=120;"
}

2) API / EF Core 加逾時控制

using (var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
{
    var rows = await _context.APSZPLANs
        .Where(x => x.APS_VERSION == apsVersion)
        .Take(1000)                // 先限制量,驗證穩定性
        .ToListAsync(cts.Token);
}

3) 分頁 & 投影(避免搬整張表)

var pageSize = 500;
var page = 0;

while (true)
{
    var batch = await _context.APSZPLANs
        .Where(x => x.APS_VERSION == apsVersion)
        .OrderBy(x => x.APS_PLAN_NO)
        .Skip(page * pageSize)
        .Take(pageSize)
        .Select(x => new { x.APS_PLAN_NO, x.APS_PLAN_SEQ, x.PLANT }) // 只拿需要欄位
        .ToListAsync();

    if (batch.Count == 0) break;

    // 處理 batch...
    page++;
}

4) 延長 Kestrel Keep-Alive(ASP.NET Core)

builder.WebHost.ConfigureKestrel(options =>
{
    options.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5);
});

5) SQL 端優化

  • 為查詢條件建立索引(例如 APS_VERSIONAPS_PLAN_NO

  • 在 SQL Developer 先跑一次,確認執行計劃與耗時

  • 能在 DB 做聚合/過濾就不要丟給應用程式




常見 Q&A

Q1:只是要快速看前端打包成果,有沒有不用裝 Node 的法子?
A:可以直接用瀏覽器開 dist/index.html,但有些 SPA 路由或相對路徑會怪。建議還是用 serve

Q2:ORA-03135 偶爾才發生,怎麼辦?
A:先將 API 查詢切分分頁減少欄位,同時檢查網路設備(WAF/Firewall)的 idle timeout。偶發通常是負載或路徑上某一層的逾時

Q3:_logger 一直報不存在,但我有 using Microsoft.Extensions.Logging;
A:別只加 using要在建構子注入 ILogger<你的類別>,並存成類別欄位才用得到。




結語

把問題各個擊破,你會發現流程其實不複雜:

  1. C#:沒有注入就沒有 _logger

  2. 前端預覽:先裝 Node.js → 有 npm → 全域裝 serve

  3. Oracle控制查詢量 + 延長/調整逾時 + 檢查網路與 DB,穩定度就上來了

留言

這個網誌中的熱門文章

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題

🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例