如何排查'无效页面参数' Netsuite中的错误

时间:2017-01-27 19:59:32

标签: netsuite suitescript

我对NetSuite来说还是比较新的,并接管了承包商为我们做的项目,所以这可能是一个简单的问题。我们有一个Suitelet,它使用nlapiRequestURL调用另一个Suitelet。正在调用的Suitelet应该返回一个ID。相反,我们会得到一个“无效页面参数”。响应。

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

所以我假设问题是在nlapiRequestURL中使用的URL中的一个参数,而不是Netsuite中脚本记录中定义的参数。以下是其中一个网址的示例。我刚刚改变了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的Suitelet中使用的唯一参数是' internalids'。我可以看到它是通过&request; request.getParameter(" internalIds")'获得的。 (见下面的代码)

作为旁注,我不确定' h'参数在URL中为for,并且无法找到配置的位置,或compid或deploy。我想知道他是否会这样做' h'价值不正确,但我不确定它是什么。为什么要“编译”,“部署”'并且' h'被包含在URL中?我可以假设compid是用于识别我们公司的,但我没有看到有人如何确定如何为请求构建URL,因为我不知道有哪些强制性参数。我猜测我不知道在Netsuite中查找该配置的位置。某处有基本网址的设置吗?

无论如何,这是正在调用的下面的脚本。另一个脚本相当长,并且有一些与公司相关的信息,所以我不打算包含它,但我认为无论如何都不重要。唯一需要知道的是我们通过nlapiRequestURL使用上面的URL来调用下面的脚本,并调用' 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);  

}

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

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

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

如果有人有任何建议,我会很感激。我或多或少地耗尽了我的知识和资源。在此先感谢,如果您需要进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分: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查询参数(内部)全部是小写的,我遇到过问题,之前参数案例被转换,这会产生不必要的麻烦。