NetSuite RESTlet运行报src property must be a valid json object求解
问题描述
编写NetSuite RESTlet脚本用于拉取工单数据同步至第三方Web应用Tulip时,运行脚本收到报错:src property must be a valid json object。
请求配置相关现象:
- 发起GET请求时已配置
Content-Type: application/json请求头,触发上述JSON对象无效报错 - 不配置该请求头时,收到报错:
Invalid data format. You should return text.
当前入门调试阶段使用的基础逻辑代码如下:
function getWOSoftLock(){ var WOColumns = new Array(); WOColumns[0] = new nlobjSearchColumn('tranid'); WOColumns[1] = new nlobjSearchColumn('status'); var filter = new nlobjSearchFilter( 'status', null, 'is', 'Released', null ); var dataoutput = nlapiSearchRecord( 'workorder', null, filter, WOColumns ); return dataoutput }
问题根因
nlapiSearchRecord接口执行后返回的是NetSuite原生封装的nlobjSearchResult对象数组,不属于可直接JSON序列化的原生JavaScript对象。RESTlet在Content-Type: application/json的请求场景下,会自动尝试把返回值序列化为JSON,遇到无法序列化的原生封装对象时就会抛出该报错。
另外该接口在无匹配搜索结果时会返回null,直接返回null也会触发格式校验异常。
排查与解决步骤
- 检查返回值类型:禁止直接返回
nlapiSearchRecord的原始返回结果,所有NetSuite封装的nlobj类型对象都不能直接作为RESTlet的JSON格式返回值 - 格式化搜索结果:遍历搜索结果集,将需要的字段值提取为普通JavaScript对象/数组结构,保证内容可被正常序列化
- 增加空值兜底:判断搜索结果是否为空,无匹配数据时返回空数组而非
null - 校验脚本部署配置:确认RESTlet脚本部署页的GET方法映射到当前编写的
getWOSoftLock函数
修正后代码
function getWOSoftLock(){ // 定义搜索返回列 var WOColumns = new Array(); WOColumns[0] = new nlobjSearchColumn('tranid'); WOColumns[1] = new nlobjSearchColumn('status'); // 定义过滤条件:状态为已下达的工单 var filter = new nlobjSearchFilter( 'status', null, 'is', 'Released' ); // 执行工单搜索 var searchResults = nlapiSearchRecord( 'workorder', null, filter, WOColumns ); // 格式化为可序列化的普通数组 var dataoutput = []; if (searchResults && searchResults.length > 0) { for (var i = 0; i < searchResults.length; i++) { var currentRow = searchResults[i]; dataoutput.push({ tranid: currentRow.getValue('tranid'), status: currentRow.getValue('status') }); } } return dataoutput; }
注意:请求时必须携带
Content-Type: application/json请求头,RESTlet会自动完成返回值的JSON序列化,不需要手动调用JSON.stringify处理返回值,手动转字符串反而会导致响应格式不符合第三方解析要求。
内容的提问来源于stack exchange,提问作者Richardv07
相关产品推荐
相关产品推荐

