🐛 Báo lỗi 9router • Windows • Usage & Analytics

Mất toàn bộ dữ liệu Usage, Analytics và lịch sử khi cập nhật phiên bản mới

Chào tác giả, mình đã kiểm tra khá kỹ và thấy đây là một bug thật sự trên Windows: khi cập nhật 9router lên phiên bản mới, dữ liệu Usage & Analytics bị mất hoàn toàn, nhưng phần Request Details / Chi tiết request thì vẫn còn.

Hiện tượng

Sau khi update, biểu đồ usage, lịch sử thống kê, cost và số liệu lifetime bị reset sạch.

Phần vẫn còn

Chi tiết request vẫn xem được bình thường, chứng tỏ không phải toàn bộ data đều mất.

Kết luận nhanh

Module lưu usage đang ghi sai chỗ: ghi vào thư mục package npm thay vì thư mục user data.

Tóm tắt lỗi

Trên Windows, 9router hiện đang có 2 kiểu lưu dữ liệu khác nhau:

Module Loại dữ liệu Vị trí lưu Kết quả khi update
requestDetailsDb Chi tiết request %APPDATA%\9router\request-details.json ✅ Không mất
usageDb Usage, analytics, thống kê, log ...\node_modules\9router\app\.9router\usage.json ❌ Mất hoàn toàn khi update
Điểm mấu chốt Thư mục node_modules\9router sẽ bị npm xóa và cài lại khi update. Nếu usage.json nằm trong đó thì việc mất dữ liệu là chắc chắn xảy ra.

Cách tái hiện lỗi

  1. Cài 9router global bằng npm.
  2. Dùng 9router một thời gian để phát sinh usage data.
  3. Mở Dashboard và xác nhận trang Usage & Analytics có dữ liệu.
  4. Chạy cập nhật phiên bản mới.
  5. Mở lại Dashboard.
  6. Phần Usage & Analytics bị reset sạch, nhưng Request Details vẫn còn.

Bằng chứng kiểm tra trên máy

%APPDATA%\9router\
├── db.json
├── request-details.json
└── mitm\

...\npm\node_modules\9router\app\.9router\
├── usage.json
└── log.txt

Tức là: request details được lưu đúng chỗ, còn usage data lại lưu nhầm bên trong package.

Nguyên nhân gốc

Trong file bundled server chunk của app, module usageDb đang resolve đường dẫn data theo cách phức tạp hơn và có một đoạn fileURLToPath() dùng path kiểu macOS đã bị hardcode khi build. Đoạn này gây lỗi trên Windows, sau đó code rơi vào fallback và ghi dữ liệu vào process.cwd() + '.9router'.

fileURLToPath("file:///Users/Working/router4/app/src/lib/usageDb.js")
Vì sao lỗi? Trên Windows, kiểu URL này không có drive letter như C:/, nên việc resolve path dễ bị văng lỗi.

Khi fallback chạy, đường dẫn trở thành:

path.join(process.cwd(), ".9router")

Trong khi server lại có process.chdir(__dirname), nên process.cwd() chính là thư mục app/ nằm bên trong package npm. Kết quả là usage data bị ghi vào:

...\node_modules\9router\app\.9router\usage.json

Tại sao phần chi tiết vẫn còn?

Vì module lưu request details dùng logic đơn giản hơn và ghi thẳng về %APPDATA%\9router, nên không bị mất khi update.

Tại sao usage bị mất?

Vì file usage nằm trong thư mục package, mà thư mục package bị npm xóa mỗi lần cài phiên bản mới.

Mức độ ảnh hưởng

Người dùng mất số liệu usage, biểu đồ, lịch sử cost, tổng requests và các thống kê theo ngày / provider / model.

Đề xuất cách sửa

Cách 1 - Sửa đơn giản nhất

Cho usageDb dùng cùng logic với requestDetailsDb: hardcode app name là 9router và ghi thẳng về thư mục user data.

Cách 2 - Sửa fileURLToPath

Nếu vẫn muốn lấy app name động, nên dùng import.meta.url thật sự thay vì một string path build cứng kiểu macOS.

Cách 3 - Thêm migrate dữ liệu

Khi app khởi động, kiểm tra nếu có app/.9router/usage.json mà chưa có file ở user data dir thì tự copy sang để cứu dữ liệu cũ.

Fix khuyến nghị Nên cho cả requestDetailsDbusageDb dùng cùng một data directory: %APPDATA%\9router trên Windows.

Workaround tạm thời cho user

Có thể set biến môi trường DATA_DIR để ép app dùng đúng thư mục dữ liệu:

[System.Environment]::SetEnvironmentVariable(
  "DATA_DIR",
  "$env:APPDATA\9router",
  "User"
)

Cách này chỉ là workaround, không phải fix gốc trong source code.

Thông tin thêm

Windows npm global install Usage & Analytics Request Details Data persistence bug
Gửi tác giả:

Mình rất thích 9router nên mới ngồi debug kỹ vụ này. Hy vọng phần phân tích này giúp anh/chị fix nhanh hơn. Nếu cần, mình có thể gửi thêm ảnh chụp, file markdown phân tích, hoặc đường dẫn các file thực tế trên máy.