调试技巧
本页面介绍Magic-API的调试方法和技巧。
在线调试
调试面板
Magic-API提供在线调试功能:
- 在编辑区域编写代码
- 在右侧配置请求参数
- 点击"运行"按钮执行
- 在底部面板查看结果
配置请求参数
Path参数
接口路径: /user/{id}
Path参数: id = 123Query参数
参数名: page
参数值: 1
参数名: limit
参数值: 10Header参数
参数名: Authorization
参数值: Bearer your_tokenBody参数
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
}
};