Skip to content

后端脚本调试

后端脚本运行在服务器端,通常通过日志排查问题。后端脚本暂时无法像前端脚本一样直接断点调试,定位问题时应先确认调用入口、输入参数和日志输出位置。

调试要点

  1. 后端脚本一般使用 TypeScript 语法编辑。
  2. 后端脚本文件后缀通常为 .action.ts
  3. 后端 .action.ts 会编译成服务器端 JavaScript 产物,并在 Rhino 脚本引擎中运行;异常堆栈通常会通过 sourcemap 映射回 .action.ts 源码行。
  4. 后端脚本主要通过打印日志、查看异常堆栈和复现输入参数来定位问题。

使用日志打印调试

action 脚本打印日志提供 printconsole 两个对象。它们会写入服务端脚本日志;是否能在控制台中看到,取决于控制台脚本日志级别。

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 的时候打印到控制台`)

不同日志级别下可用方法如下:

日志级别可输出方法
traceprint()console.trace()console.debug()console.log()console.info()console.warn()console.error()
debugprint()console.debug()console.log()console.info()console.warn()console.error()
infoconsole.log()console.info()console.warn()console.error()
warnconsole.warn()console.error()
errorconsole.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 文件可以在系统数据下的资源中找到。元数据编辑界面可能会在同一级目录生成对应产物。

系统目录下的 action 文件位置

微信公众号微信公众号:山川软件