MacOS系统下NetSuite自定义SuiteScript模块报错求助
NetSuite 2.1客户端脚本在MacOS/Safari中调用自定义模块时出现TypeError错误
问题概述
开发的NetSuite系统中,部分MacOS/OSX用户访问自定义模块时触发JS异常,Windows下Chrome/Edge/Firefox/Opera、Linux(Debian/Ubuntu)下Firefox均无此问题。因无Mac设备无法自行排查,不确定是系统还是Safari浏览器导致。
报错信息
当调用自定义模块方法时,出现以下错误:
JS_EXCEPTION TypeError undefined is not an object (evaluating ModuleName.Attribute)
具体到客户端脚本调用CM.fg1.fg1Action2时,报错为:
JS_EXCEPTION TypeError undefined is not an object (evaluating CM.fg1)
代码示例
自定义模块(CustomModule.js)
/** * CustomModule.js * @NApiVersion 2.1 * @NModuleScope Public */ define([], () => { const FunctionGroup1 = { fg1Action1 : (paramA) => { // do something } , fg1Action2 : (paramB, paramC) => { // do something } }; const FunctionGroup2 = { fg2Action1 : () => { // do something } , fg2Action2 : (paramD, paramE, paramF) => { // do something } }; return { fg1 : FunctionGroup1 , fg2 : FunctionGroup2 } });
客户端脚本
/** * @NApiVersion 2.1 * @NScriptType ClientScript * @NModuleScope SameAccount */ define(['N/runtime', 'N/search', './CustomModule'], function(runtime, search, CM) { const fieldChanged = (context) => { // 调用模块方法时触发报错 let sampleValue = CM.fg1.fg1Action2("valueA", "valueB"); }; return { fieldChanged }; });
可能的解决方案
添加模块加载校验:在调用模块方法前先检查模块及属性是否存在,避免因加载时机问题导致的报错:
const fieldChanged = (context) => { if (!CM || !CM.fg1 || typeof CM.fg1.fg1Action2 !== 'function') { console.error('CustomModule未正确加载或方法不存在'); return; } let sampleValue = CM.fg1.fg1Action2("valueA", "valueB"); };调整对象字面量语法:部分旧版本Safari对前置逗号的对象字面量解析可能存在兼容问题,改为标准后置逗号格式:
const FunctionGroup1 = { fg1Action1 : (paramA) => { // do something }, fg1Action2 : (paramB, paramC) => { // do something } }; return { fg1: FunctionGroup1, fg2: FunctionGroup2 };替换ES6箭头函数为普通函数:如果用户使用的是较旧版本的Safari,可能对箭头函数支持不完善,改用传统函数声明:
const FunctionGroup1 = { fg1Action1: function(paramA) { // do something }, fg1Action2: function(paramB, paramC) { // do something } };检查模块作用域与路径:确认自定义模块的
@NModuleScope为Public,客户端脚本的模块路径./CustomModule与文件柜中的实际路径一致,也可尝试将客户端脚本的@NModuleScope改为Public。确保模块加载完成:在客户端脚本中添加DOM加载完成的监听,确保模块在页面完全初始化后再执行逻辑:
define(['N/runtime', 'N/search', './CustomModule'], function(runtime, search, CM) { let loadedCM = CM; document.addEventListener('DOMContentLoaded', function() { console.log('模块加载状态:', loadedCM); }); const fieldChanged = (context) => { if (!loadedCM?.fg1) return; let sampleValue = loadedCM.fg1.fg1Action2("valueA", "valueB"); }; return { fieldChanged }; });
内容的提问来源于stack exchange,提问作者Michael McCauley
相关产品推荐
相关产品推荐

