2013-02-14 2 views
1

У меня есть ошибка, когда функция render называется [это приложение работает на Heroku]Ошибка в Heroku с использованием нефрита

web.js:

var async = require('async'); 
var express = require('express'); 
var util = require('util'); 

// create an express webserver 
var app = express.createServer(
    express.logger(), 
    express.static(__dirname + '/public'), 
    express.bodyParser(), 
    express.cookieParser(), 
    // set this to a secret value to encrypt session cookies 
    express.session({ secret: process.env.SESSION_SECRET || 'secret123' }), 
); 

app.set('views', __dirname + 'views'); 
app.set('view engine', 'jade'); 

// listen to the PORT given to us in the environment 
var port = process.env.PORT || 3000; 

app.listen(port, function() { 
    console.log("Listening on " + port); 
}); 



app.get('/', function (req, res) { 
    res.render('ok', { title : 'ok' }); 
}); 

ok.jade:

!!! 5 
    html(lang='en') 
    head 
     title= title 
    body 
     div#navigation 

package.json:

{ 
    "name": "package", 
    "version": "0.0.1", 

    "description": "Facebook integration, Node.js", 

    "dependencies": { 
    "express": "latest", 
    "jade":"0.17.0" 
    }, 

    "engines": { 
    "node": "0.8.19", 
    "npm" : "1.2.10" 
    } 
} 

Ошибка:

TypeError: Cannot read property '0' of undefined 
    at new View (/app/node_modules/express/lib/view.js:41:65) 
    at Function.app.render (/app/node_modules/express/lib/application.js:486:12) 
    at ServerResponse.res.render (/app/node_modules/express/lib/response.js:753:7) 
    at /app/web.js:32:9 
    at callbacks (/app/node_modules/express/lib/router/index.js:161:37) 
    at param (/app/node_modules/express/lib/router/index.js:135:11) 
    at pass (/app/node_modules/express/lib/router/index.js:142:5) 
    at Router._dispatch (/app/node_modules/express/lib/router/index.js:170:5) 
    at Object.router (/app/node_modules/express/lib/router/index.js:33:10) 
    at next (/app/node_modules/express/node_modules/connect/lib/proto.js:199:15) 

Если я отлично заменить res.render('ok', {title : 'ok'}); от res.end('some text'); работ.

Любое решение?

Спасибо!

+1

Если вы пройдете через [экспресс-исходный код] [1] Вы увидите, что 'express/lib/view.js: 41: 65' относится к' this.defaultEngine [0] 'this означает опции. defaultEngine, переданный конструктору View, не определен. Это, в свою очередь, вызывается из этого бита кода: 'if (! View) { view = new View (name, { defaultEngine: this.get ('view engine'), root: this.get ('views'), engine: engine }); ' Это означает, что' this.get ('view engine') 'работает некорректно. Вы уверены, что нефрит настроен правильно? [1]: https://github.com/visionmedia/express/blob/master/lib/view.js –

+0

Проблема в Jade, я уверен, но я не знаю, как решить эту проблему проблема! – 2013-02-15 04:59:54

+0

Как вы уверены, что проблема связана с Джейд? – jcolebrand

ответ

2

Последняя версия Экспресс кажется использовать app.engine() вместо app.set ('вид двигателя') (doc)

app.engine('jade', require('jade').__express); 

Вы можете получить более подробную информацию смотрите на this function source.

Это может решить вашу проблему.

Кроме того, добавьте «/» на пути ваших взглядов (или удалить его как it's default в экспресс)

Edit: Я проверил, если параметр «вид двигателя» был использован где-то и it is и, как сказал Бенджамин, Я не понимаю, почему ваш звонок app.set('view engine') не работал.

Редактировать 2: Я просто попытался запустить ваш код, и было несколько ошибок. Вот фиксированный web.js файл, который работает на моем локальном компьютере:

var express = require('express'); 
var util = require('util'); 

// create an express webserver 
var app = express(
    express.logger(), 
    express.static(__dirname + '/public'), 
    express.bodyParser(), 
    express.cookieParser(), 
    // set this to a secret value to encrypt session cookies 
    express.session({ secret: process.env.SESSION_SECRET || 'secret123' }) 
); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'jade'); 

// listen to the PORT given to us in the environment 
var port = process.env.PORT || 3000; 

app.listen(port, function() { 
    console.log("Listening on " + port); 
}); 



app.get('/', function (req, res) { 
    res.render('ok', { title : 'ok' }); 
}); 

Changelog:

  • удален require('async'), как это не используется и не в package.json
  • использование экспресс() вместо устаревшего «.createServer»
  • добавил недостающий / в настройке просмотра пути каталога
  • удалена запятая после express.session вызова

Todo на вашей стороне: - удалить отступ перед html в файле ok.jade.

Смежные вопросы