I have working example with express 2.* but now I am moving to version 3.*. The problem is authentication with facebook which causes some problems. All works until the everyauth makes the GET request to facebook and then returns errror:
500 Error: WARNING: You are trying to access the attribute/method configured by `findUserById`, which you did not configure. Time to configure it.
Here is the app.js code
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, config = require('./conf/config.js')
, user = require('./routes/user')
, file = require('./routes/file')
, http = require('http')
, path = require('path')
, everyauth = require('everyauth');
var UserService = require(__dirname + '/db/mongodb/UserService').UserService;
everyauth.facebook
.appId(config.fb.appId)
.scope('email')
.fields('id,name,email')
.appSecret(config.fb.appSecret)
.findOrCreateUser(function(session, accessToken, accessToExtra, fbUserMetadata) {
var promise = this.Promise();
UserService.findOne({ email: fbUserMetadata.email }, function(err, user) {
if (!user) {
// Try to register user
fbUserMetadata['accessToken'] = accessToken;
UserService.save(fbUserMetadata);
user = fbUserMetadata;
}
return promise.fulfill(user);
});
console.log(fbUserMetadata);
return promise;
})
.findUserById(function(userId, cb) {
console.log('findByUserId called');
UserService.findOne({ id: userId }, function(err, user) {
return cb(err, user);
});
})
.redirectPath('/');
var app = express();
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.compress());
app.use(express.json());
app.use(express.urlencoded());
app.use(express.methodOverride());
app.use(express.cookieParser('your secret here'));
app.use(express.session());
app.use(everyauth.middleware(app));
app.use(app.router);
app.use(require('less-middleware')({ src: __dirname + '/public' }));
app.use(express.static(path.join(__dirname, 'public')));
});
everyauth.debug = true;
//everyauth.helpExpress(app);
app.configure('development', function(){
app.use(express.errorHandler());
});
//console.log(everyauth.facebook);
app.get('/', routes.index);
app.get('/users', user.list);
app.get('/file', file.index);
app.post('/upload', file.upload);
http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));
});
To fix this add the lines:
everyauth.everymodule.findUserById(function(userId, cb) {
console.log('findByUserId called');
UserService.findOne({ id: userId }, function(err, user) {
return cb(err, user);
});
});
Make the call to findUserById
on everyauth.everymodule
instead of on everyauth.facebook
:
everyauth.everymodule.findUserById(function(userId, cb) {
console.log('findByUserId called');
UserService.findOne({ id: userId }, function(err, user) {
return cb(err, user);
});
});