使用自定义模块创建 NetSuite 脚本时获取 "All SuiteScript API Modules are unavailable while executing your define callback"

Getting "All SuiteScript API Modules are unavailable while executing your define callback" When Creating NetSuite Script With Custom Module

尝试在 NetSuite 中创建新的脚本记录时,出现错误 "Fail to evaluate script: All SuiteScript API Modules are unavailable while executing your define callback"。我找不到任何关于可能导致此问题的真实信息,而且我在我的自定义模块中也看不到任何看起来可疑的东西。我无法 post 此处的代码,因为该模块的长度接近 2,000 行,并且其中包含一些专有代码。就像我构建的另一个自定义模块在 "Upload Script File" 阶段出现问题一样,如果我删除脚本中对该模块的引用,该过程将继续,然后我可以返回到脚本并 return模块参考,之后一切似乎都正常工作。

我发现唯一有用的信息是错误可能是由于引用定义回调之外的模块引起的,但事实并非如此。该模块内部构造了两个大对象,它们是从回调中 return 编辑的。我唯一能想到的是这个模块调用了另一个自定义模块,但我没有看到任何说我不能那样做的东西。

那么,总的来说,我应该寻找什么来解决这个错误?我似乎真的找不到任何有用的或适用于这种情况的东西。

编辑

好的,所以我相信我发现原因是由于在 object/function 之外调用搜索函数被 return 回调。这是正在发生的事情的简化版本,因为很多字段和值都被管理:

/** 
 * custom.module.js
 * @NApiVersion 2.x
 * @NModuleScope Public 
 */


define(['N/search'],
/**
 * @param {search} search
 */
function(search) {

    var fields = new Array("a","b","c","d","e");
    var lValues = search.lookupFields({
            type : "customrecord_ng_cs_settings"
        ,   id : "1"
        ,   columns : fields
    });
    var _values = {
            a :     lValues.a
        ,   b :     lValues.b
        ,   c :     lValues.c
        ,   d :     lValues.d
        ,   e :     lValues.e
    };
    var _funcs = {
            func_a : function() {
                // do stuff
            }
        ,   func_b : function() {
                // do stuff
            }
        ,   func_c : function() {
                // do stuff
            }
    };

    return {
            value : _values
        ,   func : _funcs
    };

});

我需要维护这种结构,因为并非在 _values 中得到 returned 的所有内容实际上都是 search/lookup 结果。我会被迫将这个对象的构造封装在一个函数中吗?这会导致每次需要值时都进行查找吗?这是从 1.0 脚本转换过来的,并且只在开始时加载和设置一次,因此数据一直都在那里,而无需重复获取。

所以,我看到以下选项:

  1. 将回调输出转换为函数并执行类似
    的操作 每个脚本开头的以下内容:
    var _values = customModule.values();
  1. 找到一些方法来重新编写代码,以便使用该模块的任何脚本 仍然可以通过以下方式访问值:
    var _a = customModule.values.a;

我非常喜欢选项 #2。可能吗?

您不能 运行 入口点之外的任何 SuiteScript 模块代码。您需要将数据检索封装在一个函数中,然后在入口点的开头调用该函数。

如果您想避免多次提取,您可以在函数中利用记忆,或者 N/cacheN/session 来存储数据。