Node.js socketio和express passport应用程序
有人能看看我的代码,告诉我出了什么问题吗? 我是NodeJS的新手,但我正在努力理解它,并编写一个应用程序来验证用户身份,并向仪表板提供实时数据。我在登录过程中卡住了 登录屏幕在post用户通过后返回。如果我移动res.flash()函数,它会说需要进行sesion。 我花了两天时间写这段代码。请看Node.js socketio和express passport应用程序,node.js,express,socket.io,passport.js,Node.js,Express,Socket.io,Passport.js,有人能看看我的代码,告诉我出了什么问题吗? 我是NodeJS的新手,但我正在努力理解它,并编写一个应用程序来验证用户身份,并向仪表板提供实时数据。我在登录过程中卡住了 登录屏幕在post用户通过后返回。如果我移动res.flash()函数,它会说需要进行sesion。 我花了两天时间写这段代码。请看 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'
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;
有几件事:
(A) mongoose.connect()
是一个异步操作,返回承诺或接受回调。虽然它允许立即开始使用您的模型,也就是说不必等待mongoose建立到MongoDB的连接,但在执行其余代码之前,更安全的做法是提示整个逻辑以确保您的连接已打开(有关更多详细信息,请参阅)
(B) 使用会话时,Passport设置应在调用应用程序后转到。使用(会话(…)
(请参阅并向下滚动至“会话”一章)
在我看来,您应该将所有express app设置重新组合在一起,而不是将其分散到代码中,并在所有express config&route设置完成后启动服务器app.listen()
。
Passport的作者写了一个很好的例子,你可以在这里访问
(C) 您应该在某处声明这两条路由/loginsucess
和/loginFailure
(我看不到)
总的来说,我的建议是从那里逐步克隆并增加复杂性(用mongoose替换示例的假db,然后添加socket.io,…)
希望有帮助当然有帮助,非常感谢。这是一条线索,确切地知道每个模块都做什么以及它是如何运行的。我开始阅读文档,而不是编写代码,并认为这会更好。非常感谢。
mongoose.connect('mongodb://localhost/mydb')
.then(function() {
// rest of your setup goes here
}).catch(function(err) {
// do some error handling
});
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());