Ajax调用ColdFusion组件而不返回数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ajax调用ColdFusion组件而不返回数据相关的知识,希望对你有一定的参考价值。

我正在尝试使用jQuery对QueryData.cfc中的ColdFusion组件进行Ajax调用

这是QueryData.cfc代码:

<cfcomponent name="querydata" access="remote" hint="getting data from SQL database">
    <cffunction name="QueryData_Pt" access="remote" output="false" returntype="any" returnformat="JSON">
        <cfquery NAME="GrabData_Pt" DATASOURCE="#Application.PrimaryDataSource#" cachedWithin = "#CreateTimeSpan(0,0,1,0)#">
            //code;
        </cfquery>
        <cfloop query="GrabData_Pt">
            <cfset Pd_data=serializeJSON(GrabData_Pt)>
        </cfloop>
        <cfreturn GrabData_Pt>
    </cffunction>
    <cffunction name="QueryData_Pd" access="remote" returntype="any" returnformat="JSON">
        <cfquery NAME="GrabData_Pd" DATASOURCE="#Application.PrimaryDataSource#" cachedWithin = "#CreateTimeSpan(0,0,1,0)#">
            //code
        </cfquery>
        <cfloop query="GrabData_Pd">
            <cfset Pd_data=serializeJSON(GrabData_Pd)>
        </cfloop>
        <cfreturn GrabData_Pd>
    </cffunction>
    <cffunction name="QueryData_Rh" returntype="any" access="remote" returnformat="JSON">
        <cfquery NAME="GrabData_Rh" DATASOURCE="#Application.PrimaryDataSource#" cachedWithin = "#CreateTimeSpan(0,0,1,0)#">
            //somecode
        </cfquery>
        <cfloop query="GrabData_Rh">
            <cfset Rh_data=serializeJSON(GrabData_Rh)>
        </cfloop>
        <cfreturn Rh_data>
    </cffunction>
</cfcomponent>

我遇到的问题是没有任何东西被退回。我已经转储组件数据,并且查询正在按预期工作,所以不是这样,但由于某种原因,数据流向我的.cfm文件。我确定jQuery有问题所以现在是代码:

var pt_var;
var pd_var;
var rh_var;
var pt_array = [];
var pd_array = [];
var rh_array = [];

$(function() {
    getdatafromquery();

    function getdatafromquery() {
      $.ajax({
        type: 'POST',
        contentType: "application/json; charset=utf-8", // this
        dataType: "json",
        url: 'QueryData.cfc',
        data: {
          method: 'QueryData_Pt'
        }
      }).done(function(pt_data) {
        pt_var = pt_data;

      });
    }

然后我使用该数据并使用highcharts绘制它。我可以看到没有任何东西通过谷歌Chrome DevTools传递。希望很清楚我做错了什么。我是jQuery,Ajax和ColdFusion的新手,所以这对我来说是一个巨大的学习曲线哈哈。任何和所有的帮助真的很感激!

编辑:

结果我没有序列化为json。但是,现在它已被传递,它将每个单元格作为单个数组传递。这是一个例子:

DATA
:
Array(79)
0:[498]
1:[494]
2:[496]
3:[494]
4:[498]
5:[495]
答案

它的查询输出方式就是我所做的;我定义了一个查询,以便您可以看到它在循环中的调用方式:

    <cffunction name="QueryData_Pt" access="remote" output="false" returntype="any" returnformat="JSON">
   <cfset retVal = ArrayNew(1)>

       <cfquery NAME="results" DATASOURCE="#Application.PrimaryDataSource#" cachedWithin = "#CreateTimeSpan(0,0,1,0)#">
        SELECT DEPARTMENTNAME,DEPTID,EMPLID,WORKPHONE,FULL_NAME,EMAIL_ADDRESS,LOCATION
    </cfquery>

      <cfloop query="results">
       <cfset temp = {} />
       <cfset temp['DEPARTMENTNAME']=DEPARTMENTNAME />
        <cfset temp['DEPARTMENTID']=DEPTID />
        <cfset temp['EMPLID']=EMPLID />
        <cfset temp['WORKPHONE']=WORKPHONE />
        <cfset temp['FULL_NAME']=FULL_NAME />
        <cfset temp['EMAIL_ADDRESS']=EMAIL_ADDRESS />
        <cfset temp['LOCATION']=LOCATION />
    <cfset ArrayAppend(retval, temp)>
    </cfloop>

    <cfset result = {} />
    <cfset result['items'] = retVal />
    <cfreturn result>
</cffunction>

在ajax中我调用cfc并且在成功中我创建了一个var x = items.data,因此我可以用这种方式调用数据x [0] .DEPARTMENTNAME或者如果在for循环中调用for (var i = 0; i < x.length; i++) x [i] .DEPARTMENTNAME。

另一答案

使用远程.cfc方法在我的经验中引入了一些问题。它们调试起来有点棘手,它们会将攻击向量打开到.cfc文件中,这些文件通常包含所有应用程序逻辑。 ACF修复了.cfc文件中远程方法的几个安全问题,对我来说,允许远程调用我的应用程序逻辑感觉不对。

相反,我将应用程序逻辑与前端分开。可以从Web根目录(通常是/project_name/www/)访问前端代码,而其他应用程序层可以位于此目录之外 - 例如/project_name/cfusion/cfc/project_name/lib/stripe/stripe.cfc

处理ajax请求的另一种有效方法如下:我使用位于Web根目录内的.cfm文件,然后调用我的CFC。主要好处是代码分离和调试。

这是一个示例模板,我将其命名为/test.cfm

<cfscript>
setting showdebugoutput=false;
header name="Content-Type" value="application/json";

try {

    param name="url.param1" type="numeric";
    param name="url.param2" type="numeric";

} catch (any e) {
    writeOutput(serializeJSON({
        "error": "Invalid request", 
        "errorCode": -1
    }));
    abort;
}

r = {
    "errorCode": 0,
    "error": ""
};

try {

    // create and call your cfc code here
    myCFC = createObject("cfc.something").init(url.param1);
    r = myCFC.doSomething();

} catch (any e) {

    // insert your own error handling here

    param name="errorCode" default=-1;

    r.errorCode = errorCode;
    r.error = e.message & " " & e.detail; 

}

writeOutput(serializeJSON(r));
</cfscript>

然后,从浏览器中,您将使用jquery进行ajax调用,如下所示:

$.ajax({
    url: '/test.cfm',
    type: 'get',
    data: {
        param1: 4,
        param2: 90
    },
    dataType: 'json',
    success: function (json) {
        console.log(json);
    },
    error: function (xhr) {
        console.log(xhr);
        alert('an error occurred');
    }
});
另一答案

与Thor4x的答案类似,我使用它

for (i in getQuery.columnList) {
  ret.q[i] = QueryColumnData(getQuery, i);
}

我遍历getQuery.columnList并使用QueryColumnData()。结果是JSON对象的结构几乎像冷融合查询。除了它是数组ajaxReturn.key[index]的结构而不是结构数组。 ajaxReturn[index].key

您可以像他们一样手动指定列,或使用IF过滤掉某些键。

至少在Lucee(可能是ACF,因为Lucee的目标是与ACF保持一致),像recordcountcolumnList这样的元值本身并不在query.columnList中。如果您想要复制那些,您只需要在循环后手动分配。

ret.q.recordcount = getQuery.recordcount;

以上是关于Ajax调用ColdFusion组件而不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

手动加载更新数据表数据而不调用ajax

ColdFusion无法读取Ajax发送的FormData

如何在 ColdFusion 中用 AJAX 替换 iframe

为什么不能在Coldfusion中顺序调用同一组件的两个方法?

如何在 React 中强制渲染组件

select2 ajax 不会显示返回的 json 数据