2011-01-06 4 views
6

Я реализую webapp using node.js и выражаю, используя движок jade template.express + jade: предоставлена ​​локальная переменная undefined in view (node.js + express + jade)

Шаблоны визуализируются в порядке и могут обращаться к помощникам и динамическим помощникам, но не к локальным переменным, кроме локальной переменной "body", которая предоставляется экспресс-функцией и доступна и определена в моем layout.jade.

Это часть кода:

app.set ('view engine', 'jade'); 

app.get ("/test", function (req, res) { 
    res.render ('test', { 
     locals: { name: "jake" } 
    }); 
}); 

и это test.jade:

p hello 
=name 

, когда я удалить вторую строку (ссылки на название), шаблон делает правильно, показывая слово «привет» на веб-странице. Когда я включаю = имя, он бросает ReferenceError:

500 ReferenceError: Jade:2 NaN. 'p hello' NaN. '=name' name is not defined 
NaN. 'p hello' 
NaN. '=name' 

Я считаю, что я после нефрита и выразить примеры именно по отношению к локальным переменным. Я что-то делаю неправильно, или это может быть ошибка в экспресс или нефрит?

+1

Работает хорошо здесь (Node 3.4, Джейд 0,6, Экспресс 0,7. 2), можете ли вы предоставить дополнительную информацию? Например. ваши версии, а также layout.jade. –

+0

Спасибо, что исправил его. Во время некоторой путаницы установки я закончил с устаревшей экспресс-папкой в ​​~/.node_libraries. Удалив его и запустив «npm install express», установите последнюю исправленную проблему. – Jake

+0

Что касается StackOverflow, что мне делать? Удалить вопрос? Это неправдоподобно для других, так как это всего лишь версия. И я не могу отметить ваш комментарий как правильный ответ. – Jake

ответ

7
app.set ('view engine', 'jade'); 

app.get ("/test", function (req, res) { 
    res.render ('test', { 
     name: "jake" 
    }); 
}); 

Вы можете сделать это вот так.

3

Вместо =, вы можете использовать # {variable-name}. Вот пример того, как я его использую: Это отобразит страницу с меню для навигации. Передавая заголовок страницы при каждом загрузке страницы, конечно, вам нужно будет создать функцию app.get для каждой страницы.

App.js

var navigation = { 
    home : { 
    uri : "/", 
    url : "index", 
    title : "Home" 
    }, 
    lab : { 
    uri : "/lab", 
    url : "lab", 
    title : "Lab" 
    }, 
    profile : { 
    uri : "/profile", 
    url : "profile", 
    title : "Profile" 
    }, 
    timetable : { 
    uri : "/timetable", 
    url : "timetable", 
    title : "Timetable" 
    } 
} 

app.get(navigation.profile.uri, function(req, res){ //Profile 
    res.render(navigation.profile.url, { 
    title: navigation.profile.title, 
    navigation: navigation 
    }); 
}); 

profile.jade

section#page-content 
    h1#page-title #{title} 
    p Welcome to #{title} 

layout.jade

!!! 5 
html 
    head 
    title= title 
    link(rel='stylesheet', href='/stylesheets/reset.css') 
    link(rel='stylesheet', href='/stylesheets/style.css') 
    body 
    header#site-header 
     nav#site-navigation 
     != partial("partials/navigation") 
    section!= body 
    footer#page-footer 
2

Я думаю, что эта ошибка иногда вызвана из-за запроса браузера на favicon.ico.

Попробуйте добавить эти строки в голову layout.jade связать значок

link(rel='icon', href='/images/siteicon.png') 

Это сняло ту же ошибку, что я получал