Получение "Все модули SuiteScript API недоступны при выполнении обратного вызова определения" при создании сценария NetSuite с пользовательским модулем - PullRequest
0 голосов
/ 15 апреля 2020

При попытке создать новую запись сценария в NetSuite я получаю сообщение об ошибке «Не удалось выполнить оценку сценария: все модули API SuiteScript недоступны при выполнении обратного вызова определения». Я не могу найти никакой реальной информации о том, что может вызвать это, и я не вижу ничего в моем пользовательском модуле, который выглядит подозрительно. Я не могу опубликовать код здесь, так как модуль имеет длину около 2000 строк и содержит некоторый собственный код. Как и в случае с другим пользовательским модулем, который я создал, у которого были проблемы на этапе «Загрузить файл сценария», если я удалю ссылку на модуль в сценарии, процесс продолжится, а затем я смогу go вернуться к сценарию и вернуть модуль ссылка, в которой после этого все, кажется, работает правильно.

Единственная информация, которая мне показалась полезной, заключалась в том, что ошибка могла быть вызвана ссылкой на модуль вне обратного вызова define, но это не так. Модуль имеет два больших объекта, созданных внутри, и они возвращаются из обратного вызова. Единственное, о чем я могу думать, это то, что этот модуль вызывает другой пользовательский модуль, но я не видел ничего такого, что говорит, что я не могу этого сделать.

Итак, в целом, на что мне обратить внимание устранить эту ошибку? Я действительно не могу найти ничего полезного или подходящего для этой ситуации.

РЕДАКТИРОВАТЬ

Хорошо, так что я считаю, что я обнаружил, что причина заключается в вызове функции поиска извне объекта / функции, возвращаемой для обратного вызова. Вот упрощенная версия того, что происходит, поскольку многие поля и значения управляются:

/** 
 * 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, на самом деле является результатом поиска / поиска , Я собираюсь быть вынужденным заключить конструкцию этого объекта в функцию? И приведет ли это к тому, что поиск будет происходить каждый раз, когда требуется значение? Это преобразование из сценария 1.0, и оно загружается и устанавливается только один раз в начале, поэтому все данные хранятся там все время без необходимости повторной выборки.

Итак, я вижу следующие параметры:

  1. Преобразует выходные данные обратного вызова в функцию и выполняет что-то вроде
    в начале каждого сценария:
    var _values = customModule.values();
Найдите способ переработать код, чтобы любой скрипт, использующий модуль, мог по-прежнему получать доступ к значениям следующим образом:
    var _a = customModule.values.a;

Я бы очень предпочел вариант № 2. Возможно ли это?

1 Ответ

0 голосов
/ 16 апреля 2020

Вы не можете запустить любой код модуля SuiteScript за пределами точки входа. Вам нужно будет инкапсулировать извлечение данных в функцию, а затем вызывать эту функцию в начале вашей точки входа.

Если вы хотите избежать нескольких выборок, вы можете использовать в своей функции напоминание или, возможно, N/cache или N/session для хранения данных.

...