1

だから私は良いnode.js Facebookテンプレートを見つけるためにウェブを検索してきましたが、実際に見つけることができるのはこれhttps://github.com/heroku/facebook-template-nodejsです。まともですが、エクスプレス 2.4.6 とノード 0.6.x を使用します。標準に遅れずについていき、express 3.x およびノー​​ド 0.8.x で作業したいのですが、更新するpackage.jsonと、heroku のテンプレートに付属している動的ヘルパー (主に次の関数) を使用できなくなります。

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 || '');
    }
  },
});

最新の情報をどこで見つけることができるか知っている人はいますか?

4

1 に答える 1

3

こんにちは、同じ問題がありました。これを機能させるには、複数の変更が必要です。

まず、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();
    });
  },
...

写真といいねに対してこれを繰り返すと、うまくいくはずです。

于 2013-01-31T23:18:45.200 に答える