實作綜合題型結果與資料庫整合

This commit is contained in:
2025-09-29 17:24:31 +08:00
parent a3b46b4430
commit f6610013ef
21 changed files with 1341 additions and 92 deletions

View File

@@ -0,0 +1,67 @@
const https = require('https')
const http = require('http')
const checkAllCombinedTimes = async () => {
console.log('🔍 檢查所有綜合測試結果時間')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 檢查綜合測試結果 API
console.log('\n📊 檢查所有綜合測試結果...')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/test-results/combined?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
if (data.success) {
console.log(`找到 ${data.data.length} 筆綜合測試結果:`)
data.data.forEach((result, index) => {
console.log(`\n${index + 1}. 綜合測試結果:`)
console.log(` ID: ${result.id}`)
console.log(` 原始時間: ${result.completed_at}`)
const date = new Date(result.completed_at)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
console.log(` 台灣時間 (詳細): ${date.toLocaleString("zh-TW", {
timeZone: "Asia/Taipei",
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: true
})}`)
// 檢查是否是今天
const now = new Date()
const testDate = new Date(result.completed_at)
const isToday = now.toDateString() === testDate.toDateString()
console.log(` 是否為今天: ${isToday}`)
// 計算時間差
const timeDiff = now.getTime() - testDate.getTime()
const hoursDiff = Math.floor(timeDiff / (1000 * 60 * 60))
const minutesDiff = Math.floor((timeDiff % (1000 * 60 * 60)) / (1000 * 60))
console.log(` 距離現在: ${hoursDiff} 小時 ${minutesDiff} 分鐘`)
})
}
}
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
console.log('\n✅ 所有綜合測試結果時間檢查完成')
}
}
checkAllCombinedTimes()

View File

@@ -0,0 +1,73 @@
const https = require('https')
const http = require('http')
const checkAllTestTimes = async () => {
console.log('🔍 檢查所有測試結果的時間顯示')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 檢查用戶測試結果 API
console.log('\n📊 檢查用戶測試結果 API...')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/user/test-results?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
if (data.success && data.data.results.length > 0) {
console.log(`找到 ${data.data.results.length} 筆測試結果:`)
data.data.results.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.type} 測試:`)
console.log(` 原始時間: ${result.completedAt}`)
const date = new Date(result.completedAt)
console.log(` UTC 時間: ${date.toISOString()}`)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
console.log(` 台灣時間 (詳細): ${date.toLocaleString("zh-TW", {
timeZone: "Asia/Taipei",
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: true
})}`)
// 檢查是否是今天
const now = new Date()
const testDate = new Date(result.completedAt)
const isToday = now.toDateString() === testDate.toDateString()
console.log(` 是否為今天: ${isToday}`)
// 計算時間差
const timeDiff = now.getTime() - testDate.getTime()
const hoursDiff = Math.floor(timeDiff / (1000 * 60 * 60))
const minutesDiff = Math.floor((timeDiff % (1000 * 60 * 60)) / (1000 * 60))
console.log(` 距離現在: ${hoursDiff} 小時 ${minutesDiff} 分鐘`)
})
}
}
// 檢查當前時間
console.log('\n📊 當前時間:')
const now = new Date()
console.log(`UTC 時間: ${now.toISOString()}`)
console.log(`台灣時間: ${now.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
console.log('\n✅ 所有測試結果時間檢查完成')
}
}
checkAllTestTimes()

View File

@@ -0,0 +1,42 @@
const { executeQuery } = require('../lib/database/connection')
async function checkCombinedTestResultsTable() {
console.log('🔍 檢查 combined_test_results 表結構...')
console.log('=' .repeat(50))
try {
// 檢查表結構
console.log('\n📊 combined_test_results 表結構:')
const columns = await executeQuery('DESCRIBE combined_test_results')
columns.forEach(column => {
console.log(`- ${column.Field}: ${column.Type} ${column.Null === 'NO' ? 'NOT NULL' : 'NULL'} ${column.Key ? `(${column.Key})` : ''}`)
})
// 檢查表數據
console.log('\n📋 combined_test_results 表數據:')
const rows = await executeQuery('SELECT * FROM combined_test_results LIMIT 5')
if (rows.length > 0) {
console.log(`找到 ${rows.length} 筆記錄:`)
rows.forEach((row, index) => {
console.log(`\n記錄 ${index + 1}:`)
Object.entries(row).forEach(([key, value]) => {
console.log(` ${key}: ${value}`)
})
})
} else {
console.log('表中沒有數據')
}
// 檢查表索引
console.log('\n🔍 表索引:')
const indexes = await executeQuery('SHOW INDEX FROM combined_test_results')
indexes.forEach(index => {
console.log(`- ${index.Key_name}: ${index.Column_name} (${index.Index_type})`)
})
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
}
}
checkCombinedTestResultsTable()

View File

@@ -0,0 +1,42 @@
import { executeQuery } from '../lib/database/connection'
async function checkCombinedTestResultsTable() {
console.log('🔍 檢查 combined_test_results 表結構...')
console.log('=' .repeat(50))
try {
// 檢查表結構
console.log('\n📊 combined_test_results 表結構:')
const columns = await executeQuery('DESCRIBE combined_test_results')
columns.forEach((column: any) => {
console.log(`- ${column.Field}: ${column.Type} ${column.Null === 'NO' ? 'NOT NULL' : 'NULL'} ${column.Key ? `(${column.Key})` : ''}`)
})
// 檢查表數據
console.log('\n📋 combined_test_results 表數據:')
const rows = await executeQuery('SELECT * FROM combined_test_results LIMIT 5')
if (rows.length > 0) {
console.log(`找到 ${rows.length} 筆記錄:`)
rows.forEach((row: any, index: number) => {
console.log(`\n記錄 ${index + 1}:`)
Object.entries(row).forEach(([key, value]) => {
console.log(` ${key}: ${value}`)
})
})
} else {
console.log('表中沒有數據')
}
// 檢查表索引
console.log('\n🔍 表索引:')
const indexes = await executeQuery('SHOW INDEX FROM combined_test_results')
indexes.forEach((index: any) => {
console.log(`- ${index.Key_name}: ${index.Column_name} (${index.Index_type})`)
})
} catch (error) {
console.error('❌ 檢查失敗:', error instanceof Error ? error.message : '未知錯誤')
}
}
checkCombinedTestResultsTable()

View File

@@ -0,0 +1,64 @@
const https = require('https')
const http = require('http')
const checkCombinedTime = async () => {
console.log('🔍 檢查綜合測試結果時間')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 檢查綜合測試結果 API
console.log('\n📊 檢查綜合測試結果 API...')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/test-results/combined?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
if (data.success && data.data.length > 0) {
const result = data.data[0]
console.log('📋 綜合測試結果時間詳情:')
console.log(`原始時間: ${result.completed_at}`)
const date = new Date(result.completed_at)
console.log(`UTC 時間: ${date.toISOString()}`)
console.log(`台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
console.log(`台灣時間 (詳細): ${date.toLocaleString("zh-TW", {
timeZone: "Asia/Taipei",
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: true
})}`)
// 檢查是否是今天
const now = new Date()
const testDate = new Date(result.completed_at)
const isToday = now.toDateString() === testDate.toDateString()
console.log(`是否為今天: ${isToday}`)
// 計算時間差
const timeDiff = now.getTime() - testDate.getTime()
const hoursDiff = Math.floor(timeDiff / (1000 * 60 * 60))
const minutesDiff = Math.floor((timeDiff % (1000 * 60 * 60)) / (1000 * 60))
console.log(`距離現在: ${hoursDiff} 小時 ${minutesDiff} 分鐘`)
}
}
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
console.log('\n✅ 綜合測試結果時間檢查完成')
}
}
checkCombinedTime()

View File

@@ -0,0 +1,78 @@
const mysql = require('mysql2/promise')
const checkDbTimeFormat = async () => {
console.log('🔍 檢查資料庫中的時間格式')
console.log('=' .repeat(50))
const connection = await mysql.createConnection({
host: process.env.DB_HOST || 'localhost',
port: process.env.DB_PORT || 3306,
user: process.env.DB_USER || 'root',
password: process.env.DB_PASSWORD || '',
database: process.env.DB_NAME || 'hr_assessment'
})
try {
// 檢查 test_results 表的時間格式
console.log('\n📊 檢查 test_results 表的時間格式...')
const [testResults] = await connection.execute(`
SELECT id, test_type, completed_at, created_at
FROM test_results
WHERE user_id = 'user-1759073326705-m06y3wacd'
ORDER BY completed_at DESC
`)
testResults.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.test_type} 測試:`)
console.log(` ID: ${result.id}`)
console.log(` completed_at (原始): ${result.completed_at}`)
console.log(` completed_at (類型): ${typeof result.completed_at}`)
console.log(` created_at (原始): ${result.created_at}`)
console.log(` created_at (類型): ${typeof result.created_at}`)
// 測試時間轉換
const completedDate = new Date(result.completed_at)
const createdDate = new Date(result.created_at)
console.log(` completed_at 轉換: ${completedDate.toISOString()}`)
console.log(` completed_at 台灣時間: ${completedDate.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
console.log(` created_at 轉換: ${createdDate.toISOString()}`)
console.log(` created_at 台灣時間: ${createdDate.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
// 檢查 combined_test_results 表的時間格式
console.log('\n📊 檢查 combined_test_results 表的時間格式...')
const [combinedResults] = await connection.execute(`
SELECT id, completed_at, created_at
FROM combined_test_results
WHERE user_id = 'user-1759073326705-m06y3wacd'
ORDER BY completed_at DESC
`)
combinedResults.forEach((result, index) => {
console.log(`\n${index + 1}. 綜合測試:`)
console.log(` ID: ${result.id}`)
console.log(` completed_at (原始): ${result.completed_at}`)
console.log(` completed_at (類型): ${typeof result.completed_at}`)
console.log(` created_at (原始): ${result.created_at}`)
console.log(` created_at (類型): ${typeof result.created_at}`)
// 測試時間轉換
const completedDate = new Date(result.completed_at)
const createdDate = new Date(result.created_at)
console.log(` completed_at 轉換: ${completedDate.toISOString()}`)
console.log(` completed_at 台灣時間: ${completedDate.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
console.log(` created_at 轉換: ${createdDate.toISOString()}`)
console.log(` created_at 台灣時間: ${createdDate.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
await connection.end()
console.log('\n✅ 資料庫時間格式檢查完成')
}
}
checkDbTimeFormat()

View File

@@ -0,0 +1,72 @@
const https = require('https')
const http = require('http')
const checkRawTestData = async () => {
console.log('🔍 檢查原始測試數據')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 檢查邏輯測試結果
console.log('\n📊 檢查邏輯測試結果...')
const logicResponse = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/test-results/logic?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (logicResponse.status === 200) {
const logicData = JSON.parse(logicResponse.data)
if (logicData.success && logicData.data.length > 0) {
console.log('邏輯測試結果:')
logicData.data.forEach((result, index) => {
console.log(`\n${index + 1}. 邏輯測試:`)
console.log(` ID: ${result.id}`)
console.log(` 原始時間: ${result.completed_at}`)
console.log(` 創建時間: ${result.created_at}`)
const date = new Date(result.completed_at)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
}
}
// 檢查創意測試結果
console.log('\n📊 檢查創意測試結果...')
const creativeResponse = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/test-results/creative?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (creativeResponse.status === 200) {
const creativeData = JSON.parse(creativeResponse.data)
if (creativeData.success && creativeData.data.length > 0) {
console.log('創意測試結果:')
creativeData.data.forEach((result, index) => {
console.log(`\n${index + 1}. 創意測試:`)
console.log(` ID: ${result.id}`)
console.log(` 原始時間: ${result.completed_at}`)
console.log(` 創建時間: ${result.created_at}`)
const date = new Date(result.completed_at)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
}
}
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
console.log('\n✅ 原始測試數據檢查完成')
}
}
checkRawTestData()

View File

@@ -0,0 +1,68 @@
const https = require('https')
const http = require('http')
const checkTimezoneIssue = async () => {
console.log('🔍 檢查時區問題')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 1. 檢查用戶測試結果 API 返回的時間
console.log('\n📊 1. 檢查用戶測試結果 API 返回的時間...')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/user/test-results?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
if (data.success && data.data.results.length > 0) {
console.log('📋 測試結果時間:')
data.data.results.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.type}:`)
console.log(` 原始時間: ${result.completedAt}`)
// 測試不同的時間格式化方式
const date = new Date(result.completedAt)
console.log(` UTC 時間: ${date.toISOString()}`)
console.log(` 本地時間: ${date.toLocaleString()}`)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
console.log(` 台灣時間 (en): ${date.toLocaleString("en-US", { timeZone: "Asia/Taipei" })}`)
})
}
}
// 2. 檢查當前時間
console.log('\n📊 2. 檢查當前時間...')
const now = new Date()
console.log(`當前 UTC 時間: ${now.toISOString()}`)
console.log(`當前本地時間: ${now.toLocaleString()}`)
console.log(`當前台灣時間: ${now.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
// 3. 測試時間轉換
console.log('\n📊 3. 測試時間轉換...')
const testTimes = [
'2025-09-29T01:07:00.000Z', // 從 API 返回的時間
'2025-09-29T09:08:17.000Z', // 可能的另一個時間
]
testTimes.forEach((timeStr, index) => {
console.log(`\n測試時間 ${index + 1}: ${timeStr}`)
const testDate = new Date(timeStr)
console.log(` UTC: ${testDate.toISOString()}`)
console.log(` 台灣時間: ${testDate.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
console.log('\n✅ 時區問題檢查完成')
}
}
checkTimezoneIssue()

View File

@@ -0,0 +1,61 @@
const https = require('https')
const http = require('http')
const fixExistingTimes = async () => {
console.log('🔍 修正現有測試結果的時間')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 檢查現有的測試結果
console.log('\n📊 檢查現有測試結果...')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/user/test-results?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
if (data.success && data.data.results.length > 0) {
console.log('發現需要修正的測試結果:')
data.data.results.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.type} 測試:`)
console.log(` 原始時間: ${result.completedAt}`)
const date = new Date(result.completedAt)
const taiwanTime = date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })
console.log(` 台灣時間: ${taiwanTime}`)
// 檢查時間是否合理
const now = new Date()
const timeDiff = now.getTime() - date.getTime()
const hoursDiff = Math.floor(timeDiff / (1000 * 60 * 60))
if (hoursDiff > 24) {
console.log(` ⚠️ 時間可能不正確 (${hoursDiff} 小時前)`)
} else {
console.log(` ✅ 時間看起來正確 (${hoursDiff} 小時前)`)
}
})
}
}
console.log('\n📝 建議:')
console.log('1. 時間格式已修正,新的測試結果會使用正確的 UTC 時間')
console.log('2. 現有的錯誤時間數據可能需要手動修正或重新測試')
console.log('3. 建議重新進行一次測試來驗證修正效果')
} catch (error) {
console.error('❌ 檢查失敗:', error.message)
} finally {
console.log('\n✅ 現有時間檢查完成')
}
}
fixExistingTimes()

View File

@@ -0,0 +1,114 @@
const https = require('https')
const http = require('http')
const testCombinedDBIntegration = async () => {
console.log('🧪 測試綜合測試結果資料庫整合功能')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 1. 測試綜合測試結果上傳 API
console.log('\n📊 1. 測試綜合測試結果上傳 API...')
const testData = {
userId: userId,
logicScore: 10,
creativityScore: 78,
overallScore: 48,
level: '待提升',
description: '綜合能力有待提升,建議系統性訓練邏輯思維和創意能力',
logicBreakdown: {
correct: 1,
total: 10,
answers: { 0: 'A', 1: 'B', 2: 'C' }
},
creativityBreakdown: {
total: 70,
maxScore: 90,
answers: { 0: 5, 1: 4, 2: 3 }
},
balanceScore: 66,
completedAt: new Date().toISOString().replace('Z', '').replace('T', ' ')
}
console.log('測試數據:', JSON.stringify(testData, null, 2))
const uploadResponse = await new Promise((resolve, reject) => {
const req = http.request({
hostname: 'localhost',
port: 3000,
path: '/api/test-results/combined',
method: 'POST',
headers: {
'Content-Type': 'application/json',
}
}, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
req.write(JSON.stringify(testData))
req.end()
})
console.log('📊 上傳響應狀態:', uploadResponse.status)
if (uploadResponse.status === 200) {
const uploadResult = JSON.parse(uploadResponse.data)
console.log('✅ 上傳成功!')
console.log('📡 響應內容:', JSON.stringify(uploadResult, null, 2))
if (uploadResult.success) {
console.log('測試結果ID:', uploadResult.data.testResult.id)
}
} else {
console.log('❌ 上傳失敗,狀態碼:', uploadResponse.status)
console.log('響應內容:', uploadResponse.data)
}
// 2. 測試綜合測試結果獲取 API
console.log('\n📊 2. 測試綜合測試結果獲取 API...')
const getResponse = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/test-results/combined?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
console.log('📊 獲取響應狀態:', getResponse.status)
if (getResponse.status === 200) {
const getResult = JSON.parse(getResponse.data)
console.log('✅ 獲取成功!')
console.log('📡 響應內容:', JSON.stringify(getResult, null, 2))
if (getResult.success && getResult.data.length > 0) {
console.log(`找到 ${getResult.data.length} 筆綜合測試結果`)
getResult.data.forEach((result, index) => {
console.log(`\n結果 ${index + 1}:`)
console.log(` ID: ${result.id}`)
console.log(` 邏輯分數: ${result.logic_score}`)
console.log(` 創意分數: ${result.creativity_score}`)
console.log(` 總分: ${result.overall_score}`)
console.log(` 等級: ${result.level}`)
console.log(` 完成時間: ${result.completed_at}`)
})
}
} else {
console.log('❌ 獲取失敗,狀態碼:', getResponse.status)
console.log('響應內容:', getResponse.data)
}
} catch (error) {
console.error('❌ 測試失敗:', error.message)
} finally {
console.log('\n✅ 綜合測試結果資料庫整合功能測試完成')
}
}
testCombinedDBIntegration()

View File

@@ -0,0 +1,49 @@
const https = require('https')
const http = require('http')
const testNewTimeFormat = async () => {
console.log('🔍 測試新的時間格式')
console.log('=' .repeat(50))
try {
// 測試當前時間格式
console.log('\n📊 測試當前時間格式:')
const now = new Date()
const utcTime = now.toISOString()
const taiwanTime = now.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })
console.log(`當前 UTC 時間: ${utcTime}`)
console.log(`當前台灣時間: ${taiwanTime}`)
// 測試時間轉換
console.log('\n📊 測試時間轉換:')
const testDate = new Date(utcTime)
const convertedTaiwanTime = testDate.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })
console.log(`轉換後的台灣時間: ${convertedTaiwanTime}`)
// 驗證轉換是否正確
const isCorrect = taiwanTime === convertedTaiwanTime
console.log(`轉換是否正確: ${isCorrect ? '✅' : '❌'}`)
// 測試不同的時間格式
console.log('\n📊 測試不同時間格式:')
const formats = [
{ name: 'UTC 格式 (修正後)', time: now.toISOString() },
{ name: '舊格式 (有問題)', time: now.toISOString().replace('Z', '').replace('T', ' ') }
]
formats.forEach(format => {
console.log(`\n${format.name}: ${format.time}`)
const date = new Date(format.time)
const taiwan = date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })
console.log(` 轉換為台灣時間: ${taiwan}`)
})
} catch (error) {
console.error('❌ 測試失敗:', error.message)
} finally {
console.log('\n✅ 新時間格式測試完成')
}
}
testNewTimeFormat()

63
scripts/test-time-fix.js Normal file
View File

@@ -0,0 +1,63 @@
const https = require('https')
const http = require('http')
const testTimeFix = async () => {
console.log('🔍 測試時間修正效果')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 測試當前時間
console.log('\n📊 當前時間測試:')
const now = new Date()
console.log(`本地時間: ${now.toLocaleString()}`)
console.log(`UTC 時間: ${now.toISOString()}`)
console.log(`台灣時間: ${now.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
// 測試時間轉換
console.log('\n📊 時間轉換測試:')
const testTimes = [
'2025-09-29T09:16:50.637Z', // 修正後的格式
'2025-09-29 09:16:50.637', // 舊的格式
]
testTimes.forEach((timeStr, index) => {
console.log(`\n測試 ${index + 1}: ${timeStr}`)
const date = new Date(timeStr)
console.log(` 轉換為 Date 物件: ${date.toISOString()}`)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
// 檢查現有的測試結果
console.log('\n📊 檢查現有測試結果:')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/user/test-results?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
if (data.success && data.data.results.length > 0) {
data.data.results.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.type} 測試:`)
console.log(` 原始時間: ${result.completedAt}`)
const date = new Date(result.completedAt)
console.log(` 台灣時間: ${date.toLocaleString("zh-TW", { timeZone: "Asia/Taipei" })}`)
})
}
}
} catch (error) {
console.error('❌ 測試失敗:', error.message)
} finally {
console.log('\n✅ 時間修正測試完成')
}
}
testTimeFix()

View File

@@ -0,0 +1,56 @@
const https = require('https')
const http = require('http')
const testUserResultsWithCombined = async () => {
console.log('🧪 測試包含綜合測試結果的用戶測試結果 API')
console.log('=' .repeat(50))
const userId = 'user-1759073326705-m06y3wacd'
try {
// 測試用戶測試結果 API
console.log('\n📊 測試用戶測試結果 API...')
const response = await new Promise((resolve, reject) => {
const req = http.get(`http://localhost:3000/api/user/test-results?userId=${userId}`, (res) => {
let data = ''
res.on('data', chunk => data += chunk)
res.on('end', () => resolve({ status: res.statusCode, data }))
})
req.on('error', reject)
})
if (response.status === 200) {
const data = JSON.parse(response.data)
console.log('✅ API 測試成功!')
console.log('📡 響應內容:', JSON.stringify(data, null, 2))
if (data.success) {
console.log('\n📈 測試結果詳情:')
console.log(`- 總測試數: ${data.data.stats.totalTests}`)
console.log(`- 平均分數: ${data.data.stats.averageScore}`)
console.log(`- 最高分數: ${data.data.stats.bestScore}`)
console.log(`- 最近測試: ${data.data.stats.lastTestDate}`)
console.log(`- 測試次數:`, data.data.stats.testCounts)
console.log('\n📋 測試結果列表:')
data.data.results.forEach((result, index) => {
console.log(`\n${index + 1}. ${result.type}:`)
console.log(` 分數: ${result.score}`)
console.log(` 完成時間: ${result.completedAt}`)
console.log(` 測試次數: ${result.testCount}`)
console.log(` 詳細資訊:`, result.details)
})
}
} else {
console.log('❌ API 響應失敗,狀態碼:', response.status)
console.log('響應內容:', response.data)
}
} catch (error) {
console.error('❌ 測試失敗:', error.message)
} finally {
console.log('\n✅ 包含綜合測試結果的用戶測試結果 API 測試完成')
}
}
testUserResultsWithCombined()