Node.JS/Express应用程序中的Jade模板可以';找不到外部Javascript文件?

Node.JS/Express应用程序中的Jade模板可以';找不到外部Javascript文件?,javascript,node.js,express,pug,Javascript,Node.js,Express,Pug,我有一个Node.JS/Express应用程序,它使用Jade模板引擎。我有一个Javascript文件,它位于包含Jade视图的myviews目录正上方的目录中。考虑到下面的代码,我认为视图应该能够找到名为common_routines的引用服务器端Javascript文件,但是当请求视图时,我收到一个404错误,表示无法找到外部Javascript文件。这让我很困惑,因为我认为Jade模板是在服务器端执行的,那么为什么这会触发Jaderender()调用中的404错误呢 这是玉景: bloc

我有一个Node.JS/Express应用程序,它使用Jade模板引擎。我有一个Javascript文件,它位于包含Jade视图的myviews目录正上方的目录中。考虑到下面的代码,我认为视图应该能够找到名为
common_routines
的引用服务器端Javascript文件,但是当请求视图时,我收到一个404错误,表示无法找到外部Javascript文件。这让我很困惑,因为我认为Jade模板是在服务器端执行的,那么为什么这会触发Jade
render()调用中的
404错误呢

这是玉景:

block content
    script(src="../common_routines.js")
    div(style="padding:5px")
        h4 #{product.name}
    if (product.brand != null)
        p Brand: #{product.brand}
    div(class="img_and_desc")
        img(src=product.imageUrl, class="product_image", align="left")
        if (product.minimumPrice == product.maximumPrice)
            p Price: #[strong #{product.minimumPrice}]
        else
            p Price: #[strong #{product.minimumPrice}] to #[strong #{product.maximumPrice}]
        if (product.cashBack > 0)
            p Cash Back amount: #[strong #{product.cashBack}]
        if (product.freeShipping)
            p(class="text-emphasized-1") *Free Shipping!
        if (product.onSale)
            p(class="text-emphasized-2") Discounted Item
下面是呈现视图的路由文件中的调用片段,其中触发了
if(err)
分支:

           res.render(
                'ajax-product-details',
                locals,
                function (err, html) {
                    if (err)
                    // A rendering error occurred.
                        throw new Error("Rendering error(type:" + err.type + ", message: " + err.message);
                    else {
                        // Success. Send back the rendered HTML.
                        res.send(html);
                        return;
                    }
                });
下面是我在WebStorm调试器控制台窗口窗格中看到的错误。请注意,它将文件引用显示为/common_routines.js,没有前面的“.”相对目录引用,尽管前面的“.”相对目录引用在Jade文件引用
中清晰可见(“script(src=“../common_routines.js”):

以下是常见的_routines.js内容:

function truncateString(str, maxLen)
{
    if (str.length > maxLen)
        return str.substring(0, maxLen - 1) + '&hellip';
    return str;
}

module.exports =
{
    truncateString: truncateString
}
正如我所说,common_routines.js位于Jade视图正上方的目录中,那么这个外部文件引用是否出于某种原因无效

script(src="../common_routines.js")

您只能在前端引用
public
文件夹中的静态文件(如果您已将静态资产设置为从该文件夹提供服务,则可以将
common_routines.js
文件放在public文件夹中,例如
public/js/
。 现在,您可以使用
脚本(src=“/js/common_routines.js”)

如果您想在jade文件中使用函数,而不是在前端js文件中,则需要使用
var commonRoutines=require('../common_routines.js')将其作为一个包包含在内;
在服务器端js文件中。现在,您可以将此对象变量与上下文对象一起传递到视图文件中。如您所述,在渲染时将本地对象传递到视图文件中,您可以执行以下操作:

var common_routines = require('../common_routines.js');
var locals = { common_routines: common_routines };
res.render( 'ajax-product-details', locals);

现在,您可以在
ajax产品详细信息
文件中使用
common_routines.js
中的函数。

您在
app.js
文件中为公共资产设置了什么路径?@MohitBhardwaj-app.use(express.static(path.join(\u dirname,'public'));但是common_routines.js或引用该文件的视图都不在该目录树中。我之前尝试过这种方法,但我确实不再收到外部Javascript文件的404错误。但是,每次我尝试从jade视图访问Javascript文件中的函数时(例如,-p#{truncateString(product.description,400)}),我在render()回调中得到一个错误,错误类型为“called_non_callable”,消息指示带有truncateString()调用的Jade视图行在外部引用的JS调用中。因此,我将JS文件从/public dir树中移回。您不能在jade文件中使用静态外部JS文件函数。因为jade在服务器端呈现,而此JS文件在客户端可用。如果您需要在jade中包含外部JS文件中的某些函数,您需要在服务器端js文件中使用
commonRoutines=require('../common_routines.js');
将其作为一个包包含。谢谢。这为我指明了正确的方向,但为了使它正常工作,我还必须将commonRoutines变量添加到传递给render()的“locals”对象中,所以我做了:var locals={common_routines:common_routines};res.render('ajax产品详细信息',本地)。您能将此内容与最后一条评论一起添加到您的回复中,以便我可以接受吗?
var common_routines = require('../common_routines.js');
var locals = { common_routines: common_routines };
res.render( 'ajax-product-details', locals);