如何解决 Netsuite 中的“无效页面参数”错误

Posted

技术标签:

【中文标题】如何解决 Netsuite 中的“无效页面参数”错误【英文标题】:How to troubleshoot 'Invalid Page Parameter' error in Netsuite 【发布时间】:2017-01-27 19:59:32 【问题描述】:

我对 NetSuite 还比较陌生,并且已经接手了一个承包商为我们完成的项目,所以这可能是一个简单的问题。我们有一个 Suitelet,它使用 nlapiRequestURL 调用另一个 Suitelet。被调用的 Suitelet 应该返回一个 ID。相反,我们得到一个“无效的页面参数”响应。

我查看了被调用的 Suitelet 的配置,并且有一个参数设置,但该参数上的“Preference”字段为空白,根据文档表明,在这种情况下,参数值应在部署中的参数选项卡上定义。它是,并且似乎是正确的值。

所以我认为问题在于 nlapiRequestURL 中使用的 URL 中的参数之一,而不是 Netsuite 中脚本记录中定义的参数。这是其中一个 URL 的示例。我只是出于明显的原因更改了 compid:

https://forms.sandbox.netsuite.com/app/site/hosting/scriptlet.nl?script=147&deploy=1&compid=12345&h=e06792b0e7727d53f816&internalIds=17509

我确认“147”是正确的脚本 ID。我还尝试从 URL 中一个一个地删除每个参数,但这不起作用。根据我删除的那个,我要么得到“发生意外错误”,要么得到“缺少必需的参数”。在 Suitelet 中使用的唯一参数是“internalids”。我可以看到它是通过 'request.getParameter("internalIds")' 获得的。 (见下面的代码)

作为旁注,我不确定 URL 中的 'h' 参数是什么,也找不到配置该参数、compid 或 deploy 的位置。我想知道那个“h”值是否不正确,但不确定它的用途。为什么 URL 中包含“compid”、“deploy”和“h”?我可以假设 compid 用于识别我们的公司,但我没有看到有人如何确定如何为请求构建 URL,因为我不知道有哪些强制参数。我猜我不知道在 Netsuite 中哪里可以找到该配置。某处是否有基本 URL 的设置?

无论如何,这是正在调用的下面的脚本。另一个脚本要长一些,并且有一些与公司相关的信息,所以我不打算包含它,但我认为这并不重要。唯一需要知道的是,我们使用上面的 URL 和 nlapiRequestURL 来调用下面的脚本,并在结果上调用 'getBody'。

function suitelet(request, response)


nlapiLogExecution('DEBUG', 'suitelet', 'In the Preview_Link.suitelet function');
nlapiLogExecution('DEBUG', 'suitelet', 'The request is ' + JSON.stringify(request));
nlapiLogExecution('DEBUG', 'suitelet', 'The response is ' + JSON.stringify(response));

var context = nlapiGetContext();
var folderInternalId    = context.getSetting('SCRIPT', 'custscript_buffer_folder_for_temp_pdf');

var strInternalIds      = request.getParameter('internalIds');

if(!strInternalIds)
    return;
var internalIds         = strInternalIds.split(',');
if(!internalIds || internalIds.length == 0)
    return;

var xml = "<?xml version=\"1.0\"?>\n<!DOCTYPE pdf PUBLIC \"-//big.faceless.org//report\" \"report-1.1.dtd\">\n";
    xml += "<pdfset>";


for (var index = 0; index < internalIds.length; index++)

    var internalId = internalIds[index];
        xml += "<pdf src='"+ nlapiEscapeXML(nlapiLoadFile(internalId).getURL()) +"'/>";


    xml += "</pdfset>";

    var file = nlapiXMLToPDF(xml);

    file.setName(internalIds[0] + '_' + internalIds.length + '_' + Math.random() +'.pdf');
    file.setFolder(folderInternalId);
    file.setIsOnline(true);
    var internalIDUpdatedData = nlapiSubmitFile(file);

    response.writeLine(internalIDUpdatedData);  

所以 'custscript_buffer_folder_for_temp_pdf' 是在 Netsuite 中的脚本记录上定义的参数,并且在该脚本的部署选项卡上,在参数选项卡上,它有一个值 '36',这是我们想要的值。那是我们在文件柜中的“TEMP”文件夹。 'internalIds' 在调用上述脚本的脚本中定义,它可以是单个整数,也可以是逗号分隔的列表。 (虽然它似乎总是一个值)

我应该提一下,这在我们的生产实例中有效,我们两天前刚刚根据生产刷新了沙盒实例。在刷新之前,它在 Sandbox 中也不起作用。我能看到的唯一区别是,在生产中,域名在 URL 中是不同的,这当然是必须的。除了两个环境之间的代码和设置之外,所有代码和设置似乎都是相同的。

就像我说的,我是 Netsuite 的新手,所以我以前没有使用过 nlapiRequestURL。所以这可能是我忽略的非常愚蠢的事情。我已经逐步完成了执行调用的脚本中的代码,但我似乎无法调试使用 nlapiRequestURL 调用的 Suitelet。我将 nlapiLogExecution 调用作为正在调用的脚本的第一行,但它似乎从来没有达到过这一点。在实际进入该脚本之前,我只是遇到了上面提到的错误之一。

如果有人有任何建议,我将不胜感激。我或多或少地耗尽了我的知识和资源。提前致谢,如果您需要更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

您可能想尝试一些事情:

var baseSuiteletURL = nlapiResolveURL('SUITELET', SUITELET_SCRIPT_ID, SUITELET_DEPLOYMENT_ID, true); //Getting URL from script id and deployment id
var reqUrl = baseSuiteletURL + "&internalids=17509"; //Adding your GET parameter here (all in lowercase)

var requestBody = ; //Alternatively you could send your parameters within the POST body
requestBody.internalids = 17509;
var reqBody = JSON.stringify(requestBody);

var reqHeaders = ;
reqHeaders["User-Agent"] = "Mozilla/5.0"; //Sending user agent header to allow Suitelet to Suitelet calls

var myResponse = nlapiRequestURL(reqUrl, reqBody, reqHeaders);

测试以小写形式发送您的 GET Query 参数(internalids),在转换参数大小写之前我遇到过问题,这会造成不必要的麻烦。

【讨论】:

太好了。这正是我所希望的 API 相关知识的类型。我很感激。获取基本 URL 似乎是一个可能的解决方法。这说得通。我会试一试并报告。感谢您的帮助。 我尝试了您的建议并取得了一些进展。我不认为被调用的套件实际上正在进入套件的主要功能,但确实如此。日志记录刚刚设置为“错误”,我在脚本中使用了“调试”级别的调用。所以事实证明正在发生的错误是在“nlapiLoadFile”调用上。错误是“您无权访问您选择的媒体项目”。该媒体项目是文件柜中的 PDF,实际上似乎并不存在。所以我仍在努力,但当我弄清楚时我会更新答案。再次感谢 哦,您可能希望将 Suitelet 设置为以管理员身份运行。否则检查您尝试加载的文件是否不是受保护包的一部分。

以上是关于如何解决 Netsuite 中的“无效页面参数”错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 NetSuite 中的工作流更新销售订单项目

在 netsuite 高级 pdf 模板中,无论如何都可以限制字符串中的字符

如何在公式中提取事务级别线 (NetSuite)

NetSuite:如何使用高级 PDF/HTML 模板在分组发票中引用自定义字段

Freemarker / Netsuite - 将变量分配给特定的项目数量

在 Netsuite 中,如何在从项目履行生成的电子邮件中包含跟踪号列表?