我一直在努力建立一个使用快递和玉石的网站。我已经制作了几个页面和路线,到目前为止它一直很好用。我一直收到以下错误:
ReferenceError: jade is not defined
at eval (eval at <anonymous> ([...]project/node_modules/jade/lib/jade.js:165:30), <anonymous>:2:1)
at Object.exports.render ([...]project/node_modules/jade/lib/jade.js:211:10)
at Object.exports.renderFile ([...]project/node_modules/jade/lib/jade.js:247:18)
at View.exports.renderFile [as engine] ([...]project/node_modules/jade/lib/jade.js:232:21)
at View.render ([...]project/node_modules/express/lib/view.js:76:8)
at Function.app.render ([...]project/node_modules/express/lib/application.js:506:10)
at ServerResponse.res.render (/media/ruben/5CCAD622CAD5F7EA/Users/ruben/Google Drev/developer/workspace/kwasi/project/node_modules/express/lib/response.js:759:7)
at exports.home ([...]project/routes/cases.js:7:7)
at callbacks ([...]project/node_modules/express/lib/router/index.js:164:37)
at clientChosen ([...]project/app.js:81:5)
当我清除缓存和cookie时,我可以访问我的所有页面,但每当我登录时,即使用登录用户设置会话变量,我都会收到上述错误。
我不确定我可以包含哪些其他信息。堆栈跟踪引用的cases.js中的行只是
res.render("home.jade", {})
编辑:
在我的app.js中,我将jade指定为渲染引擎,其中包含以下内容:
app.configure(function() {
app.set("views", __dirname + "/views"); // Set the views folder
app.set("view engine", "jade"); // Set the rendering engine
...
我的观点如下:
extend layout
block title
title Forside - #{company}
block content
h3 Sager
- for (var i = 0; i < cases.length; i++) {
.casethumb
p #{cases[i].label}
- }
编辑2: 对。我能够确定的是它可能与我的自定义中间件有关。我有这两个功能
// Makes sure that the user is logged in
loggedIn = function(req, res, next){
if (req.session.user) {
next()
}
else {
if (req.url != "/login") {
req.flash('info', "Før du kan bruge systemet, skal du logge ind")
}
res.redirect("/login")
}
}
// Makes sure that the user has chosen a client to work on
clientChosen = function(req, res, next) {
if (req.session.selectedClient) {
next()
}
else {
res.redirect("/chooseClient")
}
}
我像这样使用它们:
app.get("/", loggedIn, clientChosen, cases.home)
当我从我的路线中移除此功能时
app.get("/", cases.home)
问题消失了,但我确实需要中间件的功能。我该如何解决这个问题?
答案 0 :(得分:0)
另外,您可以在var
和loggedIn()
常规定义之前clientChosen()
吗?在使用它们定义app.get('/');
var loggedIn = function (req, res, next) { // your code };
var clientChosen = function (req, res, next) { // your code };
如果您还没有使用它,可以安装(npm install -g jshint
)并运行jshint <path/to/js-file>
吗?它是否报告任何错误?
答案 1 :(得分:0)
经过一番挖掘后,我发现错误与玉有关。使用我使用的jade版本,当我尝试require(./something)
时,在Jade源代码中引用了一个非现有变量。为了解决这个问题,我在./node_modules/jade/lib/jade.js:151
这
if (options.client) return new Function('locals', fn)
到
//if (options.client) return new Function('locals', fn)
似乎根本不需要这条线。如果没有它,一切都会正常运转。这个问题曾经在Jade的github页面上同时提到过,而且我还提到了这个问题。这似乎是一个已知问题,他们正在处理即将发布的版本。
对于任何有同样问题的人,只需简单注释掉一行,然后你就是黄金