const http = require('http'); // 模拟 GraphQL 请求 function makeGraphQLRequest() { return new Promise((resolve, reject) => { const postData = JSON.stringify({ query: ` query GetActivities($page: Int!, $size: Int!) { activities(page: $page, size: $size) { content { id name signupDeadline playerCount playerMax state stateName coverImage { fullUrl } } totalElements totalPages number size } } `, variables: { page: 0, size: 10 } }); const options = { hostname: 'localhost', port: 8080, path: '/api/graphql', method: 'POST', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) } }; const req = http.request(options, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { const result = JSON.parse(data); resolve(result); } catch (e) { reject(e); } }); }); req.on('error', (e) => { reject(e); }); req.write(postData); req.end(); }); } // 模拟小程序的 dataset 和事件处理 function simulateClickEvent(activityId) { console.log('\n=== 模拟点击事件 ==='); console.log('活动ID:', activityId); console.log('活动ID类型:', typeof activityId); // 模拟 data-id 属性设置 const dataId = activityId; console.log('data-id 设置为:', dataId); // 模拟事件对象 const mockEvent = { currentTarget: { dataset: { id: dataId } } }; // 模拟 onDetailTap 函数 function onDetailTap(e) { const id = e.currentTarget.dataset.id; console.log('onDetailTap 获取到的 id:', id); console.log('id 类型:', typeof id); if (id) { goToActivityDetail(id); } else { console.log('❌ ID 为空或未定义'); } } // 模拟 goToActivityDetail 函数 function goToActivityDetail(activityId) { console.log('goToActivityDetail 接收到的 activityId:', activityId); console.log('activityId 类型:', typeof activityId); // 模拟 utils.navigateTo const params = { id: activityId }; console.log('传递给详情页的参数:', params); // 模拟 URL 构建 const url = '/pages/activity/detail'; const queryString = Object.keys(params) .map(key => key + '=' + encodeURIComponent(params[key])) .join('&'); const fullUrl = url + '?' + queryString; console.log('构建的完整 URL:', fullUrl); // 模拟详情页接收参数 const urlParams = new URLSearchParams('?' + queryString); const receivedId = urlParams.get('id'); console.log('详情页接收到的 id:', receivedId); console.log('详情页接收到的 id 类型:', typeof receivedId); return { url: fullUrl, params: params, receivedId: receivedId }; } // 执行点击事件 const result = onDetailTap(mockEvent); return result; } // 主函数 async function main() { try { console.log('开始测试活动ID和参数传递...\n'); const result = await makeGraphQLRequest(); if (result.data && result.data.activities && result.data.activities.content) { const activities = result.data.activities.content; console.log('获取到', activities.length, '个活动'); activities.forEach((activity, index) => { console.log('\n--- 活动', index + 1, '---'); console.log('ID:', activity.id); console.log('ID类型:', typeof activity.id); console.log('名称:', activity.name); console.log('状态:', activity.stateName); // 检查 ID 是否有效 if (!activity.id) { console.log('❌ 警告:活动ID为空'); } else if (typeof activity.id !== 'string' && typeof activity.id !== 'number') { console.log('❌ 警告:活动ID类型异常'); } else { console.log('✅ 活动ID正常'); } // 模拟点击事件 simulateClickEvent(activity.id); }); // 测试边界情况 console.log('\n=== 测试边界情况 ==='); console.log('\n1. 测试 undefined ID:'); simulateClickEvent(undefined); console.log('\n2. 测试 null ID:'); simulateClickEvent(null); console.log('\n3. 测试空字符串 ID:'); simulateClickEvent(''); console.log('\n4. 测试数字 ID:'); simulateClickEvent(123); } else { console.log('❌ 未获取到活动数据'); console.log('响应:', JSON.stringify(result, null, 2)); } } catch (error) { console.error('❌ 请求失败:', error.message); if (error.code) { console.error('错误代码:', error.code); } } } main();