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