【问题标题】:ColdFusion - No matching function [functionName] foundColdFusion - 找不到匹配的函数 [functionName]
【发布时间】:2018-05-26 11:03:56
【问题描述】:

此代码适用于我的开发环境,但不适用于生产环境。我正在将 CFC 加载到会话范围中,以防万一。从这个转储中可以看到,CFC 确实有一个名为 getQuestions 的函数,但调用它的函数没有找到它。我得到了错误

“没有找到匹配的函数 [getQuestions]”。

getQuestions 是我上次推送后添加的函数。

我已经检查了 dev 和 prod 服务器的服务器配置,它们是相同的,所以我不确定为什么会发生这种情况。 Prod 环境是一个虚拟机,如果这会产生影响的话。任何人都可以对此有所了解吗?

【问题讨论】:

  • 函数的签名是否改变了?您是加载到会话范围还是应用程序范围?如果是后者,您是否重新加载了应用程序?
  • 我正在将它加载到会话范围中。如果我在测试之前加载它,它可以工作,但是当我从测试中删除负载时,它几乎不像有两个不同的会话范围位置一样工作。如果这有意义的话。
  • 将代码添加到您的 Application.cfc 以确保您的 Session 完全超时。听起来您仍在进行旧会话。
  • 看来需要调用函数this.getQuestions()

标签: cfml lucee


【解决方案1】:

当您实例化一个对象(CFC 的一个实例)时,它会保留为该对象,以及它所来自的那个版本的类(.cfc 文件),直到它被取消范围并符合垃圾回收的条件。

你所做的一个非常简短的版本可能如下所示:

// Write a component
fileWrite("a.cfc", "component { function foo(){return 'bar';} }");

// instantiate that component
a = new a();
writeOutput(a.foo()); // writes "bar" to the page

// now let's rewrite the file
fileWrite("a.cfc", "component { function bar(){return 'foo';} }");

writeOutput(a.foo()); // still writes "bar" to the page
writeOutput(a.bar()); // error - no such method

更改a.cfc 的定义并不意味着变量a 已更改-它仍然是旧版本。

现在,您将调查对象放在会话范围内。该范围一直持续到会话结束 - 由于不活动或服务器需要重新启动,它必须超时。您可以使用 structDelete() 将其从会话中删除或覆盖它 (session.survey = new Survey()),但在发生这些事情之一之前,您的会话仍将携带旧的调查对象。

对于这样的场景,我倾向于重置会话,所以我可以添加?sessionreset=true 并在 Application.cfc 的OnRequestStart() 中添加一些代码来查找并清除我的会话。您还需要对应用程序范围的变量执行此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2020-01-14
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2018-04-30
    相关资源
    最近更新 更多