// 调试saveUserInfo GraphQL请求的脚本 const fetch = require('node-fetch'); console.log('=== 调试saveUserInfo GraphQL请求 ==='); // 测试用的token(请替换为实际的token) const testToken = 'YOUR_TOKEN_HERE'; // 请从小程序控制台获取实际token // GraphQL查询 const mutation = ` mutation SaveUserInfo($input: UserInput!) { saveUserInfo(input: $input) { id name avatar phone gender birthday wxOpenId unionId } } `; const variables = { input: { name: "测试用户", phone: "13981970816", gender: "MALE", birthday: "2025-10-07" } }; async function testSaveUserInfo() { console.log('\n--- 测试参数 ---'); console.log('GraphQL Endpoint:', 'http://localhost:8080/api/graphql'); console.log('Token:', testToken ? `${testToken.substring(0, 20)}...` : '无'); console.log('Variables:', JSON.stringify(variables, null, 2)); if (!testToken || testToken === 'YOUR_TOKEN_HERE') { console.log('\n❌ 请先设置有效的token'); console.log('💡 在小程序开发者工具控制台运行: console.log("token:", wx.getStorageSync("token"))'); return; } try { console.log('\n--- 发送请求 ---'); const headers = { 'Content-Type': 'application/json', 'Authorization': `Bearer ${testToken}` }; console.log('请求头:', headers); const response = await fetch('http://localhost:8080/api/graphql', { method: 'POST', headers: headers, body: JSON.stringify({ query: mutation, variables: variables }) }); console.log('\n--- 响应信息 ---'); console.log('状态码:', response.status); console.log('状态文本:', response.statusText); const responseText = await response.text(); console.log('响应内容:', responseText); if (responseText) { try { const result = JSON.parse(responseText); if (result.errors) { console.log('\n❌ GraphQL错误:'); result.errors.forEach((error, index) => { console.log(`错误 ${index + 1}:`, error.message); if (error.extensions) { console.log('扩展信息:', error.extensions); } }); } if (result.data && result.data.saveUserInfo) { console.log('\n✅ 保存成功:'); console.log(JSON.stringify(result.data.saveUserInfo, null, 2)); } } catch (parseError) { console.log('\n❌ JSON解析失败:', parseError.message); } } } catch (error) { console.log('\n❌ 请求失败:', error.message); } } // 测试token有效性 function testTokenFormat(token) { console.log('\n--- Token格式检查 ---'); if (!token || token === 'YOUR_TOKEN_HERE') { console.log('❌ 没有提供token'); return false; } const parts = token.split('.'); if (parts.length !== 3) { console.log('❌ Token格式无效(不是JWT格式)'); return false; } try { const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString()); console.log('Token payload:', { userId: payload.userId, phone: payload.phone, exp: payload.exp ? new Date(payload.exp * 1000).toLocaleString() : 'N/A', iat: payload.iat ? new Date(payload.iat * 1000).toLocaleString() : 'N/A' }); const now = Math.floor(Date.now() / 1000); const isExpired = payload.exp && payload.exp <= now; console.log('Token是否过期:', isExpired); return !isExpired; } catch (error) { console.log('❌ Token解析失败:', error.message); return false; } } // 执行测试 console.log('开始测试...'); const isValidToken = testTokenFormat(testToken); if (isValidToken) { testSaveUserInfo(); } else { console.log('\n🔧 解决步骤:'); console.log('1. 在小程序开发者工具控制台获取token:'); console.log(' console.log("token:", wx.getStorageSync("token"))'); console.log('2. 将获取到的token替换脚本中的 YOUR_TOKEN_HERE'); console.log('3. 重新运行此脚本'); }