You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();

关键修复说明

  1. 发起实际请求:添加了https.request()创建请求对象,监听response事件收集响应数据,最后调用req.end()发送请求。
  2. 修正POST/GET逻辑:POST请求设置JSON头并写入请求体,GET请求将数据拼到URL参数,符合HTTP规范。
  3. 补充deckId定义:添加了缺失的deckId变量,需要你替换成实际的ID值。
  4. 添加错误处理:监听请求的error事件,以及JSON解析的异常捕获,避免静默失败。
  5. 优化变量使用:登录时使用定义好的username、password、apiKey变量,getCards使用登录返回的真实sessionId而非硬编码值。

现在运行代码,你应该能在命令行看到完整的执行日志,包括请求发起的提示、登录响应、session ID,以及卡片获取的结果(如果API正常的话)。

内容的提问来源于stack exchange,提问作者sheel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:35:17