首页 文章

如何解决Netsuite中的'Invalid Page Parameter'错误

提问于
浏览
0

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

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

所以我假设问题是在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中使用的唯一参数是'internalids' . 我可以看到它是通过'request.getParameter(“internalIds”)'获得的 . (见下面的代码)

作为旁注,我不确定URL中的'h'参数是什么,并且无法找到配置它或compid或deploy的位置 . 我想知道这个'h'值是不正确的,但我不确定它的用途是什么 . 为什么“compid”,“deploy”和“h”都包含在URL中?我可以假设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'在调用上面的脚本的脚本中定义,它可以是单个整数,也可以是逗号分隔的列表 . (虽然它似乎总是单一的 Value )

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

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

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

1 回答

  • 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查询参数(内部)都是小写的,我遇到过问题之前的参数案例被转换,它会产生不必要的麻烦 .

相关问题