🛠【實戰排除教學】從 VS Code 的 _logger 錯誤,到 PowerShell 找不到 npm/serve,再到 Oracle ORA-03135 連線中斷——一次搞懂!
前言
這篇文章把你在實務中可能一次遇到的三類問題整合成一篇易懂、可照做的排錯筆記:
-
C# / EF Core:VS Code 顯示
CS0103: The name '_logger' does not exist
-
前端部署預覽:PowerShell 說找不到
serve
、更慘的是連npm
、node
也找不到 -
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
-
類別欄位
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
(); } } }
-
確保 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)
-
下載 LTS 版本(長期維護版):打開瀏覽器 → 前往
nodejs.org
-
執行
.msi
安裝檔,記得勾選 “Add to PATH” -
安裝完重開 PowerShell,確認版本:
node -v npm -v
方案 B:已安裝但 PATH 遺失
到 控制台 → 系統 → 進階系統設定 → 環境變數 → 系統變數 Path,新增:
C:\Program Files\nodejs\
儲存後重開 PowerShell,再測一次
node -v
、npm -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_VERSION
、APS_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<你的類別>
,並存成類別欄位才用得到。
結語
把問題各個擊破,你會發現流程其實不複雜:
-
C#:沒有注入就沒有
_logger
-
前端預覽:先裝 Node.js → 有 npm → 全域裝 serve
-
Oracle:控制查詢量 + 延長/調整逾時 + 檢查網路與 DB,穩定度就上來了
留言
張貼留言