Конфигурирование findByUserId для каждого пользователя - узел, экспресс, мангуста, каждый

Я довольно новичок в Node.js и Express. Я пытаюсь завершить настройку Everyauth с помощью Twitter, и я пытаюсь получить доступ к "res.user" на стороне сервера, который согласно документации EveryAuth требует, чтобы был настроен.findByUserId. Вот где у меня проблемы. Как вы настраиваете findByUserId?

Вот что я получил. В настоящее время он работает, чтобы создать нового пользователя или войти в него, я не настроил.findByUserId правильно, но предоставил мне доступ к req.user, который мне нужен на стороне сервера. Если у вас есть другие предложения по оптимизации этого кода, пожалуйста, дайте мне знать, так как я только учусь.

Код отредактирован ниже...

App.js

var express = require('express')
  , everyauth   = require('everyauth')
  , util        = require('util')
  , Promise     = everyauth.Promise
  , users       = require('./lib/users')
  , config      = require('./config.js')
  , twitter     = require('./lib/twitter')
  , games        = require('./lib/games')

  everyauth.twitter
    .consumerKey(config.twitter.consumerKey)
    .consumerSecret(config.twitter.consumerSecret)
    .findOrCreateUser( function (session, accessToken, accessTokenSecret, twitterUserMetadata) {
      var promise = this.Promise();
      users.findOrCreateUserbyTwitterData(twitterUserMetadata, accessToken, accessTokenSecret, promise)
      return promise;
    })
    .redirectPath('/');
  everyauth.everymodule.findUserById(function (userId, callback) {
      users.findById(userId, callback);
  });

var app = module.exports = express.createServer();
everyauth.helpExpress(app);
// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(express.cookieParser());
  app.use(express.session({secret: "FxT10477A93d54HJx5"}));
  app.use(everyauth.middleware());
  app.set('view engine', 'jade');
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function(){
  app.use(express.errorHandler());
});

// Routes

app.get('/', function(req, res){
  console.log(req.user);
  res.render('index', { title: 'Zeitheist 2' });
});

Users.js

var twitter = require(__dirname + "/twitter");
var mongoose = require('mongoose');
var Schema = mongoose.Schema
  , ObjectId = Schema.ObjectId;

var userSchema = new Schema({
    user                  : ObjectId
    , id                  : Number
    , twitterId           : Number
    , twitterName         : String
    , profileImageUrl     : String
    , name                : String
    , dateCreated         : Date
    , session             : String
    , accessToken         : String
    , accessTokenSecret   : String
});

var conn = mongoose.createConnection('mongodb://localhost/zeitheist2_test');
var userModel = conn.model('User', userSchema);

this.findOrCreateUserbyTwitterData = function(twitterData, accessToken, accessTokenSecret, promise) {
  userModel.find({'twitterId' : twitterData.id}, function(err, users) {
     if(err) throw err;
     if(users.length > 0) {
       promise.fulfill(users[0]);
     } else {
       var user = new userModel();
       user.twitterId = twitterData.id
       user.twitterName = twitterData.screen_name
       user.profileImageUrl = twitterData.profile_image_url
       user.name = twitterData.name
       user.accessToken = accessToken
       user.accessTokenSecret = accessTokenSecret
       user.save(function(err) {
         if (err) throw err;
         twitter.follow(accessToken, accessTokenSecret);
         promise.fulfill(user);
       });
     }
   });
}
this.findById = function(userId, callback) {
  userModel.findOne({'_id' : userId}, function(err, user) {
    if(err) throw err;
    if(callback) 
      callback(user);
    else
      return user;
  }); 
}

Как должен выглядеть everyauth.everymodule.findUserById, чтобы я мог получить доступ к req.user? На маршруте по умолчанию, когда я вхожу в req.user после успешного входа в систему, отображается "неопределенный"

1 ответ

Ваш код должен выглядеть примерно так:

everyauth.everymodule.findUserById(function (userId, callback) {
    userModel.findById(userId, callback);
});

В вашем коде вы возвращаете значения из функций, которые вместо этого должны вызывать обратные вызовы. Помните, что большинство всего в узле является асинхронным и использует обратные вызовы для возврата результатов всего, что связано с поиском ввода-вывода, например, с поиском в базе данных.

Другие вопросы по тегам