所以我一直在网上搜索找到一个好的node.js Facebook模板,但我真正能找到的就是这个https://github.com/heroku/facebook-template-nodejs。它很不错,但它使用了快速2.4.6和节点0.6.x.我想要跟上标准并在Express 3.x和node 0.8.x中工作,但如果我更新package.json
我就不能再使用heroku模板附带的动态助手了,主要是这些函数: / p>
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 || '');
}
},
});
有谁知道我在哪里可以找到最新的信息?
答案 0 :(得分: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.x app.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();
});
},
...
对照片和喜欢重复此操作,你应该很好。