2017-05-15 6 views
0

誰かが私のコードを見て何が間違っているかを教えてもらえますか? 私はノードjsに新しいですが、私はそれを理解し、ユーザーを認証し、ライブデータをダッシュ​​ボードに提供するアプリケーションを作成しようとしています。私はログイン手順に固執した。socketioとエクスプレスパスポート

ユーザーが投稿した後にログイン画面が表示されます。私が関数res.flash()を動かすなら、それはsesionを必要としていると言います。 私はこのコードを書くのに2日間を費やします。見てください。

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var exphbs = require('express-handlebars'); 
var flash = require('connect-flash'); 

var index = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

var passport = require('passport'); 
var signature = require('cookie-signature'); 
var LocalStrategy = require('passport-local').Strategy; 
var mongoose = require('mongoose'); 
var http = require('http'); 
var cookie = require('cookie'); 

// Starting express server 

app.set('port', process.env.PORT || 3000); 

var server = app.listen(app.get('port'), function() {}); 

// Share variables to socket; 
var onlineUsers = []; var dataIO=[]; 

// MONGOSE DATABASE 
mongoose.connect('mongodb://localhost/mydb'); 
var Schema = mongoose.Schema; 
var db = mongoose.connection; 

var UserDetail = new Schema({ 
username: String, 
password: String 
}, { 
collection: 'users' 
}); 
var users = mongoose.model('users', UserDetail); 
app.use(flash()); 
/// PASSPORT 
app.use(passport.initialize()); 
app.use(passport.session()); 
var session = require('express-session'); 
var store = new session.MemoryStore(); 
var secret = 'secret-session-key'; 

app.use(session({ 
secret : secret, 
store : store, 
saveUninitialized: true, 
resave: true} 
)); 

app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
extended: true 
})); 

app.use(function (req, res, next) { 
    res.locals.success_msg = req.flash('success_msg'); 
    res.locals.error_msg = req.flash('error_msg'); 
    res.locals.error = req.flash('error'); 
    res.locals.user = req.user || null; 
    next(); 
}); 

app.post('/login', 
passport.authenticate('local', { 
    successRedirect: '/loginSuccess', 
    failureRedirect: '/loginFailure', 
}) 
); 

passport.serializeUser(function(user, done) { 
done(null, user); 
}); 

passport.deserializeUser(function(user, done) { 
done(null, user); 
}); 

passport.use(new LocalStrategy({ 
    usernameField: 'username', 
    passwordField: 'password' 
}, 
function(username, password, done) { 
    process.nextTick(function() { 
     // auth logic 
     users.findOne({ 
      'username': username, 
     }, function(err, user) { 
      if (err) { 
       return done(err); 
      } 
      if (!user) { 
       return done(null, false); 
      } 
      if (user.password != password) { 
       return done(null, false); 
      } 
      return done(null, user); 
     }); 
    }); 
})); 

var io = require('socket.io').listen(server); 
io.on('connection', function (socket) { 
socket.send('hi'); 
socket.send('onlineUsers :'+ onlineUsers); 

}); 
io.on('connection', function(socket) { 
if (socket.handshake & socket.handshake.headers &    socket.handshake.headers.cookie) { 
    var raw = cookie.parse(socket.handshake.headers.cookie)['connect.sid']; 
    if (raw) { 
     socket.sessionId = signature.unsign(raw.slice(2), secret); 
    } 
} 
if (socket.sessionId) { 
    store.get(socket.sessionId, function(err, session) { 
     // console.log(session.passport.user.username); 
     if (session) { 
      if (onlineUsers.indexOf(session.passport.user.username) == -1) { 
       onlineUsers.push(session.passport.user.username); 
       console.log(onlineUsers); 
      } 
     } 
    }); 
} 
socket.on('disconnect', function() { 
    console.log('disconnecting'); 
    if (socket.handshake & socket.handshake.headers & socket.handshake.headers.cookie) { 
     var raw = cookie.parse(socket.handshake.headers.cookie)['connect.sid']; 
     if (raw) { 
      socket.sessionId = signature.unsign(raw.slice(2), secret); 
     } 
    } 
    if (socket.sessionId) { 
     // console.log(socket.sessionId); 
     store.get(socket.sessionId, function(err, session) { 
      if (session) { 
       // console.log(session); 
       console.log(onlineUsers); 
        onlineUsers.splice(onlineUsers.indexOf(session.passport.user.username), 1); 
       console.log(onlineUsers); 
      } 
     }); 
    } 
}); 
}); 





// view engine setup 
app.set('views', path.join(__dirname, 'views')); 

app.engine('handlebars', exphbs({defaultLayout: 'layout'})); 
app.set('view engine', 'handlebars'); 

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', index); 
app.use('/users', users); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// error handler 
app.use(function(err, req, res, next) { 
    // set locals, only providing error in development 
    res.locals.message = err.message; 
    res.locals.error = req.app.get('env') === 'development' ? err : {}; 

    // render the error page 
    res.status(err.status || 500); 
    res.render('error'); 
}); 



module.exports.onlineUsers = onlineUsers; 
module.exports = app; 

答えて

0

いくつかのこと:

(A)mongoose.connect()は約束を返すか、コールバックを取る非同期操作です。 MongooseがMongoDBへの接続を確立するのを待つことなく、すぐにモデルを使用することができますが、残りのコードを実行する前に接続が確実にオープンしていることを保証することがより安全です(http://mongoosejs.com/docs/connections.html詳細)私の意見で

mongoose.connect('mongodb://localhost/mydb') 
    .then(function() { 
     // rest of your setup goes here 
    }).catch(function(err) { 
     // do some error handling 
    }); 

(B)セッションを使用した場合、パスポートのセットアップがapp.use(session(...))後にコールを行くべき(http://www.passportjs.org/docs/configureを参照し、 "セッション" の章をスクロールダウン)

app.use(session({ 
    secret : secret, 
    store : store, 
    saveUninitialized: true, 
    resave: true} 
)); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ 
    extended: true 
})); 
app.use(flash()); 

/// PASSPORT 
app.use(passport.initialize()); 
app.use(passport.session()); 

あなたはすべてのtを再編成すべきです彼はあなたのコードに広げるのではなく、アプリケーション設定を一緒に表現して、エクスプローラ設定&のルート設定がすべて完了したらサーバapp.listen()を起動します。 パスポートの作者は、あなたがここにアクセスできるという良い例を書いたhttps://github.com/passport/express-4.x-local-example/

(C)あなたは2つのルートに宣言する必要があります/loginSuccessとどこか/loginFailure(私はそれを見ることはできません)

https://github.com/passport/express-4.x-local-example/のクローンを作成するために全体的に私の提案は次のようになりますそこから徐々に複雑さを追加します(socket.io次を追加し、マングースによる例の偽デシベルを置き換え、...)

は、それはそれはどうもありがとうございました、助け確か

+0

に役立ちます願っています。これは、すべてのモジュールが何を行い、どのように動作するかを正確に知る手掛かりです。私はコードを書くのではなく、ドキュメントを読むことを始め、より良いと思う。ありがとうございました。 –

関連する問題