2013-06-04 28 views
2

我已經在網上運行的Heroku的示例應用程序的一個問題,它完全在本地,但在Heroku它顯示了這個錯誤:Heroku的默認Node.js應用程式

TypeError: /app/views/index.ejs:7 
    5|  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=2.0, user-scalable=yes" /> 
    6| 
>> 7|  <title><%= app.name %></title> 
    8|  <link rel="stylesheet" href="stylesheets/screen.css" media="Screen" type="text/css" /> 
    9|  <link rel="stylesheet" href="stylesheets/mobile.css" media="handheld, only screen and (max-width: 480px), only screen and (max-device-width: 480px)" type="text/css" /> 
    10| 

Cannot read property 'name' of undefined 
    at Object.<anonymous> (eval at <anonymous> (/app/node_modules/ejs/lib/ejs.js:198:12)) 
    at Object.<anonymous> (/app/node_modules/ejs/lib/ejs.js:200:15) 
    at ServerResponse._render (/app/node_modules/express/lib/view.js:422:21) 
    at ServerResponse.render (/app/node_modules/express/lib/view.js:315:17) 
    at /app/web.js:49:11 
    at [object Object].me (/app/node_modules/faceplate/index.js:114:7) 
    at /app/web.js:48:18 
    at /app/node_modules/faceplate/index.js:104:7 
    at EventEmitter.<anonymous> (/app/node_modules/faceplate/index.js:131:11) 
    at EventEmitter.emit (events.js:70:17) 

我讀的地方,可能是一個問題在的package.json所以這裏的依賴關係是我的package.json文件:

{ 
    "name": "facebook-template-node", 
    "version": "0.0.1", 

    "description": "Template app for Heroku/Facebook integration, Node.js language", 

    "dependencies": { 
    "async":  "0.1.18", 
    "ejs":  "0.4.3", 
    "express": "2.4.6", 
    "faceplate": "0.6.x" 
    }, 

    "engines": { 
    "node": "0.6.x" 
    } 
} 

和這裏的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' }), 
    require('faceplate').middleware({ 
    app_id: process.env.FACEBOOK_APP_ID, 
    secret: process.env.FACEBOOK_SECRET, 
    scope: 'user_likes,user_photos,user_photo_video_tags' 
    }) 
); 

// 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.dynamicHelpers({ 
    'host': function(req, res) { 
    return req.headers['host']; 
    }, 
    'scheme': function(req, res) { 
    return req.headers['x-forwarded-proto'] || 'http'; 
    }, 
    'url': function(req, res) { 
    return function(path) { 
     return app.dynamicViewHelpers.scheme(req, res) + app.dynamicViewHelpers.url_no_scheme(req, res)(path); 
    } 
    }, 
    'url_no_scheme': function(req, res) { 
    return function(path) { 
     return '://' + app.dynamicViewHelpers.host(req, res) + (path || ''); 
    } 
    }, 
}); 

function render_page(req, res) { 
    req.facebook.app(function(err, app) { 
    req.facebook.me(function(user) { 
     res.render('index.ejs', { 
     layout: false, 
     req:  req, 
     app:  app, 
     user:  user 
     }); 
    }); 
    }); 
} 

function handle_facebook_request(req, res) { 

    // if the user is logged in 
    if (req.facebook.token) { 

    async.parallel([ 
     function(cb) { 
     // query 4 friends and send them to the socket for this socket id 
     req.facebook.get('/me/friends', { limit: 4 }, function(friends) { 
      req.friends = friends; 
      cb(); 
     }); 
     }, 
     function(cb) { 
     // query 16 photos and send them to the socket for this socket id 
     req.facebook.get('/me/photos', { limit: 16 }, function(photos) { 
      req.photos = photos; 
      cb(); 
     }); 
     }, 
     function(cb) { 
     // query 4 likes and send them to the socket for this socket id 
     req.facebook.get('/me/likes', { limit: 4 }, function(likes) { 
      req.likes = likes; 
      cb(); 
     }); 
     }, 
     function(cb) { 
     // use fql to get a list of my friends that are using this app 
     req.facebook.fql('SELECT uid, name, is_app_user, pic_square FROM user WHERE uid in (SELECT uid2 FROM friend WHERE uid1 = me()) AND is_app_user = 1', function(result) { 
      req.friends_using_app = result; 
      cb(); 
     }); 
     } 
    ], function() { 
     render_page(req, res); 
    }); 

    } else { 
    render_page(req, res); 
    } 
} 

app.get('/', handle_facebook_request); 
app.post('/', handle_facebook_request); 

回答

1

您似乎在使用res.render函數,但似乎並沒有將它傳遞給應用程序對象。我相信(除非我錯過了某些東西),您需要將應用程序對象傳遞給渲染函數。例如:

res.render('view_name', { app: { name: 'Site_Name' } }); 

另一種選擇,如果你是在大量的視圖中使用的應用程序,是添加的應用對象也app.locals,這將使它在所有視圖可用(從渲染當前應用程序)。這是可以做到的:

app.locals({ 
    app: { 
     name: 'Site_Name' 
    } 
}); 

,然後你不需要通過應用每個渲染調用,並

res.render('view_name', {}); 

應該工作。

+0

但我沒有改變任何東西,這是模板的應用程序,當你一個箱子的NodeJS Facebook應用程序,但是這裏的res.render的代碼: 功能render_page(REQ,RES){ req.facebook.app(功能(ERR,應用程序){ req.facebook.me(功能(用戶){ res.render( 'index.ejs',{ 佈局:假, REQ:REQ, 應用程式:應用程序,用戶 :用戶 }); }); }); } – ziz194

+0

我在我的文章中添加了web.js的完整代碼,請查看它。 – ziz194