主题
后端脚本调试
后端脚本运行在服务器端,通常通过日志排查问题。后端脚本暂时无法像前端脚本一样直接断点调试,定位问题时应先确认调用入口、输入参数和日志输出位置。
调试要点
- 后端脚本一般使用 TypeScript 语法编辑。
- 后端脚本文件后缀通常为
.action.ts。 - 后端
.action.ts会编译成服务器端 JavaScript 产物,并在 Rhino 脚本引擎中运行;异常堆栈通常会通过 sourcemap 映射回.action.ts源码行。 - 后端脚本主要通过打印日志、查看异常堆栈和复现输入参数来定位问题。
使用日志打印调试
action 脚本打印日志提供 print 和 console 两个对象。它们会写入服务端脚本日志;是否能在控制台中看到,取决于控制台脚本日志级别。
print 输出的日志级别为 debug。控制台脚本日志级别设置为 debug 或更低级别时,才能看到 print 日志。
typescript
print(`日志级别为 debug 的时候打印到控制台`)console 对象支持不同日志级别:
typescript
console.trace(`日志级别为 trace 的时候打印到控制台`)
console.debug(`日志级别为 trace,debug 的时候打印到控制台`)
console.log(`日志级别为 trace,debug,info 的时候打印到控制台`)
console.info(`日志级别为 trace,debug,info 的时候打印到控制台`)
console.warn(`日志级别为 trace,debug,info,warn 的时候打印到控制台`)
console.error(`日志级别为 trace,debug,info,warn,error 的时候打印到控制台`)不同日志级别下可用方法如下:
| 日志级别 | 可输出方法 |
|---|---|
| trace | print()、console.trace()、console.debug()、console.log()、console.info()、console.warn()、console.error() |
| debug | print()、console.debug()、console.log()、console.info()、console.warn()、console.error() |
| info | console.log()、console.info()、console.warn()、console.error() |
| warn | console.warn()、console.error() |
| error | console.error() |
代码示例
typescript
const SAMPLE_USER_NAME: string = "demo-user";
const SAMPLE_USER_INFO: JSONObject = {
name: "demo-user",
role: "tester",
source: "sample"
}
/**
* 测试控制台打印输出日志
*/
export function getPersonInfo(request: HttpServletRequest, response: HttpServletResponse, params: any) {
let personName: string = params.name;
console.debug(`开始查询${personName}的个人信息`)
if (personName) {
try {
let personInfo: JSONObject = getPersonInfoFromDb(personName);
if (personInfo) {
console.debug(`查询到${personName}的信息,返回数据`)
return { success: true, data: personInfo };
}
console.debug(`未查询到${personName}的信息`)
return { success: false, message: `没有查询到${personName}的信息` };
} catch (e) {
console.error("身份查询接口出现异常")
return { success: false, message: `系统异常` };
}
}
}
function getPersonInfoFromDb(name: string): JSONObject {
if (name === SAMPLE_USER_NAME) {
console.debug(SAMPLE_USER_INFO)
return SAMPLE_USER_INFO;
}
return null;
}
普通请求中的脚本日志是否出现在控制台,取决于控制台脚本日志级别。在批处理等带进度对象的场景中,print() 还会把日志写入 ProgressDialog;console.log()、console.info() 等方法只写服务端脚本日志。
print() 方法和 console 下的方法打印日志均有行数限制,默认为 10000,可以在系统设置下更改。

利用日志定位异常
代码示例
typescript
import metadata from "svr-api/metadata"
/**
* 批处理脚本模板
*/
function main() {
print("在批处理命令中使用 print 或 console 方法可以直接将日志输出到控制台中");
try {
let file = getFile("abcdefg");
let path = file.path;
} catch (e) {
console.error(e);
}
}
function getFile(fileId: string) {
let file = metadata.getFile(fileId, true);
return file
}
打印出来的异常信息通常能帮助定位出错位置。启用 .action.ts 编译和 sourcemap 后,优先查看映射回源码的 .action.ts 行号;旧版或兼容 .action 文件再查看脚本产物行号。
说明
旧版或兼容 .action 文件可以在系统数据下的资源中找到。元数据编辑界面可能会在同一级目录生成对应产物。

