Skip to content

调试技巧

本页面介绍Magic-API的调试方法和技巧。

在线调试

调试面板

Magic-API提供在线调试功能:

  1. 在编辑区域编写代码
  2. 在右侧配置请求参数
  3. 点击"运行"按钮执行
  4. 在底部面板查看结果

配置请求参数

Path参数

接口路径: /user/{id}
Path参数: id = 123

Query参数

参数名: page
参数值: 1

参数名: limit
参数值: 10

Header参数

参数名: Authorization
参数值: Bearer your_token

Body参数

json
{
    "username": "test",
    "password": "123456"
}

日志输出

基础日志

javascript
// 不同级别的日志
log.debug("调试信息");
log.info("普通信息");
log.warn("警告信息");
log.error("错误信息");

带变量的日志

javascript
var userId = 123;
var username = "张三";

// 使用占位符
log.info("用户ID: {}, 用户名: {}", userId, username);

// 输出: 用户ID: 123, 用户名: 张三

输出对象

javascript
var user = db.selectOne("SELECT * FROM eb_user WHERE id = 1");

// 输出对象(自动转JSON)
log.info("用户信息: {}", user);

// 格式化输出
log.info("用户信息: {}", JSON.stringify(user, null, 2));

断点调试

使用breakpoint

javascript
var data = db.select("SELECT * FROM eb_user LIMIT 10");

// 设置断点,查看data的值
breakpoint(data);

// 继续执行
return data;

中间结果查看

javascript
var step1 = db.select("SELECT * FROM eb_user");
log.info("Step1 结果数量: {}", step1.length);

var step2 = step1.filter(u => u.status == 1);
log.info("Step2 结果数量: {}", step2.length);

var step3 = step2.map(u => ({
    id: u.id,
    name: u.nickname
}));
log.info("Step3 结果: {}", step3);

return step3;

常见问题排查

SQL错误

javascript
try {
    var result = db.select("SELECT * FROM non_existent_table");
} catch (e) {
    log.error("SQL执行失败: {}", e.message);
    log.error("错误详情: {}", e);
    exit 500, "数据库查询失败: " + e.message;
}

空值问题

javascript
var user = db.selectOne("SELECT * FROM eb_user WHERE id = ?", param.id);

// 检查空值
if (!user) {
    log.warn("用户不存在, ID: {}", param.id);
    exit 404, "用户不存在";
}

// 安全访问属性
var phone = user.phone || "未设置";
var nickname = user.nickname ?? "匿名用户";

类型问题

javascript
var id = param.id;

// 检查类型
log.info("ID类型: {}", typeof id);
log.info("ID值: {}", id);

// 类型转换
var numId = parseInt(id);
var strId = String(id);

HTTP请求问题

javascript
try {
    var result = http.get('https://api.example.com/data', {
        timeout: 5000
    });

    log.info("HTTP状态码: {}", result.code);
    log.info("响应头: {}", result.headers);
    log.info("响应体: {}", result.body);

    if (result.code != 200) {
        log.error("请求失败: {}", result.body);
        exit 500, "外部接口请求失败";
    }

    return result.data;
} catch (e) {
    log.error("HTTP请求异常: {}", e.message);
    exit 500, "网络请求失败";
}

性能分析

执行时间

javascript
var startTime = Date.now();

// 执行查询
var result = db.select("SELECT * FROM eb_user");

var endTime = Date.now();
log.info("查询耗时: {}ms", endTime - startTime);

return result;

SQL性能

javascript
// 分析慢查询
var sql = """
    SELECT * FROM eb_store_order
    WHERE create_time > '2024-01-01'
    ORDER BY id DESC
""";

var startTime = Date.now();
var result = db.select(sql);
var duration = Date.now() - startTime;

if (duration > 1000) {
    log.warn("慢查询警告: {}ms, SQL: {}", duration, sql);
}

return result;

环境区分

javascript
var env = env.get('PROFILE', 'dev');

if (env == 'dev') {
    // 开发环境,输出详细日志
    log.debug("开发环境调试信息...");
} else if (env == 'prod') {
    // 生产环境,只输出必要日志
    log.info("生产环境执行...");
}

调试技巧总结

1. 分步执行

javascript
// 将复杂逻辑拆分成多步
var step1Result = doStep1();
log.info("Step1完成: {}", step1Result);

var step2Result = doStep2(step1Result);
log.info("Step2完成: {}", step2Result);

return step2Result;

2. 边界检查

javascript
// 检查输入
if (!param.id) {
    log.warn("参数id为空");
    exit 400, "参数id不能为空";
}

// 检查查询结果
var result = db.selectOne("...");
if (!result) {
    log.warn("查询结果为空");
}

3. 异常捕获

javascript
try {
    // 可能出错的代码
} catch (e) {
    log.error("发生异常: {}", e.message);
    log.error("堆栈: {}", e.stack);
    throw e;
}

4. 返回调试信息

javascript
// 开发时返回额外调试信息
return {
    data: result,
    debug: {
        sql: sql,
        params: params,
        duration: duration
    }
};

下一步

成都艾唯特软件有限公司