You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Suitelet 2.x长数组查询触发SSS_REQUEST_TIME_EXCEEDED问题求助

解决Suitelet 2.x长数组查询超时的方案

1. 替换GET请求为POST传递长参数

URL存在长度限制,直接通过url.resolveScript携带长数组参数易触发超时或参数截断,改用POST请求将长数组放在请求体中传递:

客户端脚本示例

function loadOverviewData() {
    var brandIds = [1, 2, 3, 4, 21, 22, 23, 24, 25, 26, 41, 48, 39, 40, 19, 16, 69, 70, 71, 72, 73, 82, 75, 76, 77, 78, 81];
    var targetScriptUrl = url.resolveScript({
        scriptId: 'customscript_your_data_fetch_script',
        deploymentId: 'customdeploy_your_data_fetch_script'
    });

    fetch(targetScriptUrl, {
        method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify({
            brandIds: brandIds,
            timePeriod: 'last_month'
        })
    })
    .then(res => res.json())
    .then(data => renderReportData(data))
    .catch(err => {
        console.error(err);
        document.getElementById('data-container').textContent = 'Data unavailable';
    });
}

服务端Suitelet示例

/**
 * @NApiVersion 2.x
 * @NScriptType Suitelet
 */
define(['N/search'], function(search) {
    function onRequest(context) {
        if (context.request.method === 'POST') {
            var reqBody = JSON.parse(context.request.body);
            var brandIds = reqBody.brandIds || [];
            var timePeriod = reqBody.timePeriod;

            var reportData = fetchOptimizedData(brandIds, timePeriod);

            context.response.setHeader({name: 'Content-Type', value: 'application/json'});
            context.response.write(JSON.stringify(reportData));
        }
    }

    function fetchOptimizedData(brandIds, timePeriod) {
        var dateRange = getTimeRange(timePeriod);
        var transactionSearch = search.create({
            type: search.Type.TRANSACTION,
            filters: [
                ['subsidiary', 'anyof', brandIds],
                'AND',
                ['trandate', 'within', dateRange]
            ],
            columns: ['trandate', 'amount', 'entity']
        });

        var results = [];
        var pagedResults = transactionSearch.runPaged({pageSize: 1000});
        pagedResults.pageRanges.forEach(pageRange => {
            var page = pagedResults.fetch({index: pageRange.index});
            page.data.forEach(result => {
                results.push({
                    date: result.getValue('trandate'),
                    amount: result.getValue('amount'),
                    customer: result.getText('entity')
                });
            });
        });
        return results;
    }

    function getTimeRange(period) {
        var now = new Date();
        if (period === 'last_month') {
            var lastMonthStart = new Date(now.getFullYear(), now.getMonth() - 1, 1);
            var lastMonthEnd = new Date(now.getFullYear(), now.getMonth(), 0);
            return [lastMonthStart, lastMonthEnd];
        } else if (period === 'last_year') {
            var lastYearStart = new Date(now.getFullYear() - 1, 0, 1);
            var lastYearEnd = new Date(now.getFullYear() - 1, 11, 31);
            return [lastYearStart, lastYearEnd];
        }
        return [];
    }

    return {onRequest: onRequest};
});

2. 用自定义记录封装品牌分组

将品牌分组逻辑迁移到NetSuite自定义记录中,避免传递长数组:

  • 创建自定义记录类型(如customrecord_brand_group),每条记录对应一个业务分组,添加多选择字段关联品牌ID;
  • 客户端仅传递分组的记录ID,服务端通过ID查询自定义记录获取品牌ID集合。

服务端获取品牌ID示例

function getBrandIdsFromGroup(groupRecordId) {
    var groupRec = record.load({
        type: 'customrecord_brand_group',
        id: groupRecordId
    });
    return groupRec.getValue({fieldId: 'custrecord_associated_brands'}).split(',');
}

3. 拆分请求并行处理

若需处理超大量数据,可将长数组拆分为多个小批次,并行发起请求后在客户端合并结果:

function loadSplitData() {
    var allBrandIds = [/* OVERVIEW的品牌ID数组 */];
    var batchSize = 9;
    var batches = [];
    for (let i = 0; i < allBrandIds.length; i += batchSize) {
        batches.push(allBrandIds.slice(i, i + batchSize));
    }

    Promise.all(batches.map(batch => {
        return fetch(url.resolveScript({/* 脚本信息 */}), {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({brandIds: batch, timePeriod: 'last_month'})
        }).then(res => res.json());
    }))
    .then(allResults => {
        var mergedData = [].concat(...allResults);
        renderReportData(mergedData);
    })
    .catch(err => {
        document.getElementById('data-container').textContent = 'Data unavailable';
    });
}

4. 调整超时与优化搜索性能

  • 在Suitelet的脚本部署配置中,将超时时间调整至最大值(30000ms,即30秒);
  • 搜索时仅返回必要字段,避免不必要的关联查询;
  • 使用预定义的已保存搜索,NetSuite会对已保存搜索做性能优化。

内容的提问来源于stack exchange,提问作者chellybelly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 01:44:53