こんにちは、同じ問題がありました。これを機能させるには、複数の変更が必要です。
まず、package.json の依存関係を更新する必要があります。
"dependencies": {
"async": "0.1.x",
"ejs": "0.8.x",
"express": "3.1.x",
"faceplate": "0.4.x"
},
次に、「npm install」を実行して、ローカルのものを更新します。
web.js のいくつかの場所で次の操作が必要です。私のセットアップでは、上部にある「必須」のリストを更新する必要がありました。
var async = require('async');
var express = require('express');
var util = require('util');
var http = require('http');
var path =require('path');
次に、上部にある古い (2.x) スタイルの高速初期化をコメント アウトします。次に、新しい 3.x 準拠のものを追加します。
var store = new express.session.MemoryStore;
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.set('view options', { pretty: true });
app.locals.pretty = true;
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser('secret'));
app.use(express.session({ secret: 'secret', store: store }));
app.use(express.static(path.join(__dirname, 'public')));
app.use(require('faceplate').middleware({
app_id: process.env.FACEBOOK_APP_ID,
secret: process.env.FACEBOOK_SECRET,
scope: 'user_likes,user_photos,user_photo_video_tags'
}));
// fix dynamic helpers
app.use(function(req,res,next){
res.locals.host = req.headers['host'];
res.locals.scheme = req.headers['x-forwarded-proto'] || 'http';
res.locals.url_no_scheme = function(path) {
return '://' + res.locals.host + path;
};
res.locals.url = function(path) {
return res.locals.scheme + res.locals.url_no_scheme(path);
};
next();
});
});
前のブロックには、元の質問に対する修正が含まれていることに注意してください。これらの変数/関数を res.locals として設定する独自のミドルウェアを追加するだけです。この時点で、古い 2.xapp.dynamicHelpers
ブロックをコメント アウトできます。
3.x スタイルの初期化を追加します。
var server = http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port')
+ ":" + app.get('env'));
});
この時点で、問題は「解決」されていますが、まだうまくいきません。どうやらフェイスプレートの最新の API (おそらく FB の変更による) が多少変更されたようです。そのため、アプリを承認してからページをレンダリングしようとすると、エラーが発生します。これは、facebook.get
コールバックのシグネチャが関数内で正しくないこととhandle_facebook_request
、コールバックに渡されるデータが変更されていることが原因です。
友達を例にすると、次のようになります。
...
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 4 friends and send them to the socket for this socket id
req.facebook.get('/me/friends', { limit: 4 }, function(dummy,friends) {
req.friends = friends.data;
cb();
});
},
...
写真といいねに対してこれを繰り返すと、うまくいくはずです。