NodeJS调用登录API无命令行输出:问题排查与正确实现
问题排查与修复方案
Let's break down why your code isn't producing any output and fix it properly:
主要问题分析
performRequest函数未发起实际请求:你只定义了请求配置options,但没有调用https.request()创建请求,也没有处理响应流,导致请求根本没发送,success回调永远不会执行。- POST/GET请求逻辑颠倒:当前代码中POST请求把数据拼到URL参数里,GET请求反而设置请求体相关头,这完全不符合HTTP规范——POST应该将JSON数据放在请求体,GET才通过URL传递参数。
deckId变量未定义:getCards函数里使用了deckId但没有声明赋值,会引发运行时错误。- 缺少错误处理:没有监听请求的
error事件,出现错误时也不会有任何提示。
修复后的完整代码
var querystring = require('querystring'); var https = require('https'); var host = 'blahabc.com'; // 去掉https://,因为https.request的host只需要域名 var username = 'xxxxx'; var password = '******'; var apiKey = '*****'; var sessionId = '1234567890'; var deckId = 'your-deck-id-here'; // 补充定义deckId,替换成实际值 function performRequest(endpoint, method, data, success) { console.log("performRequest called"); var dataString = JSON.stringify(data); var options = { host: host, path: endpoint, method: method, headers: {} }; if (method === 'POST') { // POST请求:设置JSON请求头,把数据放在请求体 options.headers['Content-Type'] = 'application/json'; options.headers['Content-Length'] = dataString.length; } else if (method === 'GET') { // GET请求:把数据拼到URL的query参数里 options.path += '?' + querystring.stringify(data); } // 创建并发送请求 var req = https.request(options, function(res) { res.setEncoding('utf8'); var responseBody = ''; // 收集响应数据 res.on('data', function(chunk) { responseBody += chunk; }); // 响应结束后解析JSON并触发success回调 res.on('end', function() { try { var responseData = JSON.parse(responseBody); success(responseData); } catch (err) { console.error('Error parsing JSON response:', err); } }); }); // 监听请求错误,避免静默失败 req.on('error', function(err) { console.error('Request error:', err); }); // POST请求时写入请求体数据 if (method === 'POST') { req.write(dataString); } // 结束请求 req.end(); } console.log("bye"); function login() { console.log("login function called"); performRequest('/api/login', 'POST', { username: username, password: password, api_key_id: apiKey }, function(data) { console.log('Login response:', data); sessionId = data.result.id; console.log('Logged in successfully, session ID:', sessionId); getCards(); }); } function getCards() { console.log("getCards function called"); performRequest('/api/post_login/' + deckId + '/cards', 'POST', { session_id: sessionId, // 使用登录获取的真实sessionId,而非硬编码 "_items_per_page": 100 }, function(data) { console.log('Fetched ' + data.result.paging.total_items + ' cards'); }); } login();
关键修复说明
- 发起实际请求:添加了
https.request()创建请求对象,监听response事件收集响应数据,最后调用req.end()发送请求。 - 修正POST/GET逻辑:POST请求设置JSON头并写入请求体,GET请求将数据拼到URL参数,符合HTTP规范。
- 补充
deckId定义:添加了缺失的deckId变量,需要你替换成实际的ID值。 - 添加错误处理:监听请求的
error事件,以及JSON解析的异常捕获,避免静默失败。 - 优化变量使用:登录时使用定义好的
username、password、apiKey变量,getCards使用登录返回的真实sessionId而非硬编码值。
现在运行代码,你应该能在命令行看到完整的执行日志,包括请求发起的提示、登录响应、session ID,以及卡片获取的结果(如果API正常的话)。
内容的提问来源于stack exchange,提问作者sheel
相关产品推荐
相关产品推荐

