在没有“解析文件或目录未找到”错误的情况下重新加载Fusebox应用程序的最佳方法是什么?

时间:2009-04-25 18:03:12

标签: coldfusion fusebox

我有一个使用CF8和Fusebox 5的网站。每当我需要为网站添加新功能时,我通常需要为circuit.xml.cfm添加一个新的保险丝,用于控制器,型号或视图,或者所有。要启用这些新功能/页面,请转到以下网址:

?fusebox.load=true&fusebox.parse=true&fusebox.password=password&fusebox.loadclean=true

最后一个参数是我最近选择的参数,并确定使用它可以启用我的新保险丝;没有它,新的保险丝不被识别。但是,当我这样做时,之前生成的所有解析文件都将被删除。这不是什么大问题,因为它们在第一次需要时会动态重新生成,但我有一些页面在访问时会返回错误。该错误表示目录未找到,但它们在那里,每次出现都是因为解析文件不存在。

以下是堆栈跟踪的一个错误示例:

Error - Parsed File or Directory not found.

Date/Time: Apr 25 2009 12:26:02

Type: fusebox.missingParsedFile

Message: Parsed File or Directory not found.

Detail:

Attempting to execute the parsed file 'login.logout.cfm' threw an error. This can occur if the parsed file does not exist in the parsed directory or if the parsed directory itself is missing.
Stack Trace:
    coldfusion.runtime.CustomException: Parsed File or Directory not found.
    at coldfusion.tagext.lang.ThrowTag.doStartTag(ThrowTag.java:124)
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
    at cffusebox52ecfm1214986498.runPage(C:\example.com\fb5core\fusebox5.cfm:216)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
    at cfindex2ecfm584653367.runPage(C:\example.com\index.cfm:3)
    at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:192)
    at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:366)
    at coldfusion.runtime.CfJspPage._emptyTag(CfJspPage.java:2644)
    at cfApplication2ecfc1103573364$funcONREQUEST.runFunction(C:\example.com\Application.cfc:36)
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:418)
    at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:360)
    at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:324)
    at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:56)
    at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:277)
    at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:192)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:448)
    at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:308)
    at coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:74)
    at coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:243)
    at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:269)
    at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
    at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
    at coldfusion.filter.PathFilter.invoke(PathFilter.java:86)
    at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
    at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
    at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
    at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
    at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
    at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
    at coldfusion.CfmServlet.service(CfmServlet.java:175)
    at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
    at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
    at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
    at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
    at jrun.servlet.FilterChain.service(FilterChain.java:101)
    at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
    at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
    at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:284)
    at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
    at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
    at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320)
    at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
    at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266)
    at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

我要解决此问题的方法是转到以下网址,就像前一个网址一样,但没有fusebox.loadclean = true:

?fusebox.password=password&fusebox.load=true&fusebox.parse=true

我尝试做的是在转到第一个网址后,我会转到第二个网址,但错误仍然存​​在。

我正在寻找的是重新加载电路而不产生这些错误的正确方法。我是第三个参与此站点的开发人员,因此前两个可能有不同的配置每个circuit.xml.cfm实例的样式。这些文件用于确定所需内容的应用程序流,附加安全层以及指定某些属性。这是Fusebox方法:

<!-- controller/circuit.xml.cfm -->
<circuit access="public">
    <fuseaction name="index">
        <set name="request.title" value="Account overview" />
        <do action="layout.header" />
        <do action="mdashboard.index" />
        <do action="vdashboard.index" />
        <do action="layout.footer" />
    </fuseaction>

    <fuseaction name="profile">
        <set name="request.title" value="Your Profile" />
        <do action="layout.header" />

        <!-- form submitted to the same page -->
        <if condition="isDefined('attributes.submit')">
            <true>
                <do action="mdashboard.updateprofile" />
                <do action="vdashboard.profile" />
            </true>
            <false>
                <do action="mdashboard.profile" />
                <do action="vdashboard.profile" />
            </false>
        </if>

        <do action="layout.footer" />
    </fuseaction>
</circuit>

<!-- model/circuit.xml.cfm -->
<circuit access="internal">
    <fuseaction name="index">
        <include template="sqlIndex" />
    </fuseaction>

    <fuseaction name="profile">
        <include template="sqlProfile" />
    </fuseaction>

    <fuseaction name="updateprofile">
        <include template="actUpdateProfile" />
    </fuseaction>
</circuit>

<!-- view/circuit.xml.cfm -->
<circuit access="internal">
    <fuseaction name="index">
        <include template="dspIndex" />
    </fuseaction>

    <fuseaction name="profile">
        <include template="dspProfile" />
    </fuseaction>
</circuit>

这是Fusebox和ColdFusion方法的混合:

<!-- controller/circuit.xml.cfm -->
<circuit access="public">
    <fuseaction name="index">
        <set name="request.title" value="Account overview" />
        <do action="layout.header" />
        <include template="ctrlIndex" />
        <do action="layout.footer" />
    </fuseaction>

    <fuseaction name="profile">
        <set name="request.title" value="Your Profile" />
        <do action="layout.header" />
        <include template="ctrlProfile" />
        <do action="layout.footer" />
    </fuseaction>
</circuit>

<!-- model/circuit.xml.cfm -->
<circuit access="internal">
</circuit>

<!-- view/circuit.xml.cfm -->
<circuit access="internal">
</circuit>

<!-- controller/ctrlProfile.cfm -->
<cfif isDefined("attributes.submit")>
    <cfinclude template="../model/actUpdateProfile.cfm">
</cfif>

<cfinclude template="../model/sqlPaymentOptions.cfm">
<cfinclude template="../view/dspPaymentOptions.cfm">

这两种方法都在整个网站中使用,我并不反对使用任何一种方法,但我的目标是减少用户尝试访问特定页面时可能出现的任何错误。我当时认为问题可能是混合的配置方法,我应该坚持使用Fusebox方法,但是我没有找到这个错误的常见趋势。每次页面收到​​错误时,我们都有错误处理程序给我发电子邮件,所以我想我可以自动调用我的第二个URL并将它们重定向回发生此特定错误时生成错误的页面,但这有无限循环的可能性,并没有解决真正的问题。

我是不是错了?我可以在网址中包含哪些属性,这些属性会强制网站识别新的保险丝而不清除我的解析文件? CF本身并不难编码,但我还是比较新的,所以我可以向后看。谢谢!

2 个答案:

答案 0 :(得分:9)

注意:新的保险丝不需要重新加载保险丝盒 - 只有新的保险丝需要一个。

我不完全确定你所得到的错误是否是我认为的错误,但以下是不错的做法......

如果您进行了更改并需要重新加载保险箱,您应该做的是:

  1. 将最新代码部署到同一服务器上的pre-Live'staging'区域。
    • 使用fusebox.parseall=truefusebox.loadclean=true
    • 在此区域生成已解析的文件
    • 将所有文件从那里复制到您的Live webroot。
    • 在实际网站上执行保险箱fusebox.load=true - 没有别的(密码除外)。
  2. (注意:如果需要,在步骤3之前将您的站点设置为离线/维护模式,然后在步骤4之后将其重新联机)

答案 1 :(得分:0)

有没有理由不使用fusebox.mode =“development-full-load”(在fusebox.xml中设置)?如果你还没有在这种模式下开发,这可以让你的生活更轻松。