2017-02-16 10 views
1

Я использую app.use(express.static(path.join(__dirname,'public')));, чтобы показать страницу входа, прежде чем показывать index.html в Node.js.Как показать страницу входа перед показом index.html с помощью express.static в node.js

Однако, он не показывает страницу входа перед тем index.html ... Я пытался использовать app.get('/', function (req,res) {res.redirect('/login');});, но она даже не пройти через этот app.get и не перенаправляются, когда он подключается к локальной машине: 4000 .. .

мои настройки каталога показано ниже

myapp 
    node_modules 
    public 
    images 
    javascripts 
    js 
    stylesheets 
    index.html 
    routes 
    views 
    login 
     login.ejs 
    users 
     new.ejs 
    index.jade 
    layout.jade 
    app.js 
    package.json 

Кроме того, я хочу, чтобы держать index.html в общей папке, и вы хотите, чтобы отобразить страницу входа до этого .. есть ли какие-либо способы, чтобы показать, что? ?

Вот весь мой код в app.js

var io = require('socket.io'); 
var express = require('express'); 
var app = express(); 
var redis = require('redis'); 
var sys = require('util'); 
var fs = require('fs'); 
//Added for connecting login session 
var http = require('http'); 
var server = http.createServer(app); 
var path = require('path'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var session = require('express-session'); 
var flash = require('connect-flash'); 
var async = require('async'); 
var bodyParser = require('body-parser'); 
var methodOverride = require('method-override'); 

//connecting database 
mongoose.connect("my mongoDB private address"); 
var db = mongoose.connection; 
db.once("open",function() { 
    console.log("DB connected!"); 
}); 
db.on("error",function (err) { 
    console.log("DB ERROR :", err); 
}); 

var bcrypt = require("bcrypt-nodejs"); 
var userSchema = mongoose.Schema({ 
    email: {type:String, required:true, unique:true}, 
    password: {type:String, required:true}, 
    createdAt: {type:Date, default:Date.now} 
}); 
userSchema.pre("save", function (next){ 
    var user = this; 
    if(!user.isModified("password")){ 
    return next(); 
    } else { 
    user.password = bcrypt.hashSync(user.password); 
    return next(); 
    } 
}); 
userSchema.methods.authenticate = function (password) { 
    var user = this; 
    return bcrypt.compareSync(password,user.password); 
}; 

var User = mongoose.model('user',userSchema); 

io = io.listen(server); 

app.set("view engine", 'ejs'); 

app.use(express.static(path.join(__dirname, 'public'))); 

//setting middleware for login 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended:true})); 
app.use(methodOverride("_method")); 
app.use(flash()); 

app.use(session({secret:'MySecret', resave: true, saveUninitialized: true})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 
passport.deserializeUser(function(id, done) { 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 

var LocalStrategy = require('passport-local').Strategy; 
passport.use('local-login', 
    new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     User.findOne({ 'email' : email }, function(err, user) { 
     if (err) return done(err); 

     if (!user){ 
      req.flash("email", req.body.email); 
      return done(null, false, req.flash('loginError', 'No user found.')); 
     } 
     if (!user.authenticate(password)){ 
      req.flash("email", req.body.email); 
      return done(null, false, req.flash('loginError', 'Password does not Match.')); 
     } 
     return done(null, user); 
     }); 
    } 
) 
); 
//set home routes 
//var data_1 = {email:''}; 

app.get('/', function (req,res) { 
    res.redirect('/login'); 
    //req.url = '/login'; 
    //next(); 
}); 
app.get('/login', function (req,res) { 
    res.render('login/login',{email:req.flash("email")[0], loginError:req.flash('loginError')}); 
}); 
app.post('/login', function(req, res, next) { 
passport.authenticate('local-login', function(err, user, info) { 
    if (err) { return next(err); } 
    if (!user) { return res.redirect('/login'); } 
    return res.redirect('/?channel='+ req.body.email); 
    })(req, res, next); 
}); 
app.get('/logout', function(req, res) { 
    req.logout(); 
    res.redirect('/login'); 
}); 

// set user routes 
app.get('/users/new', function(req,res){ 
    res.render('users/new', { 
          formData: req.flash('formData')[0], 
          emailError: req.flash('emailError')[0], 
          passwordError: req.flash('passwordError')[0] 
          } 
); 
}); // new 
app.post('/users', checkUserRegValidation, function(req,res,next){ 
    User.create(req.body.user, function (err,user) { 
    if(err) return res.json({success:false, message:err}); 
    res.redirect('/login'); 
    }); 
}); // create 

//functions 
function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()){ 
    return next(); 
    }else{ 
    res.redirect('/login'); 
    } 
    res.redirect('/'); 
} 

function checkUserRegValidation(req, res, next) { 
    var isValid = true; 

    async.waterfall(
    [function(callback) { 
     User.findOne({email: req.body.user.email, _id: {$ne: mongoose.Types.ObjectId(req.params.id)}}, 
     function(err,user){ 
      if(user){ 
      isValid = false; 
      req.flash("emailError","- This email is already resistered."); 
      } 
      callback(null, isValid); 
     } 
    ); 
    }], function(err, isValid) { 
     if(err) return res.json({success:"false", message:err}); 
     if(isValid){ 
     return next(); 
     } else { 
     req.flash("formData",req.body.user); 
     res.redirect("back"); 
     } 
    } 
); 
} 

function handler(req,res){ 
    console.log(req); 
     fs.readFile(__dirname + '/public/index.html', function(err,data){ 
       if(err){ 
         res.writeHead(500); 
         return res.end('Error loading index.html'); 
       } 

       res.writeHead(200); 
       console.log("Listening on port 3000"); 
       res.end(data); 
     }); 

     fs.readFile(__dirname + '/public/style.css', function(err,data){ 
       if(err){ 
         res.writeHead(500); 
         return res.end('Error loading index.html'); 
       } 

       res.writeHead(200); 
       console.log("Listening on port 3000"); 
       res.end(data); 
     }); 
} 

io.sockets.addListener('connection', function(socket){ 
    console.log("connceted : " + socket.id); 

    var subscriber = redis.createClient(6379, 'localhost'); 
    subscriber.psubscribe("*"); 
    subscriber.on("pmessage", function(pattern, channel, message) { 
     //console.log(message); 
     socket.emit(channel, message); 
    }); 

    socket.on('disconnect', function() { 
     console.log("disconnceted : " + socket.id); 
     subscriber.quit(); 
    }); 

    socket.on('close', function() { 
     console.log("close"); 
     subscriber.quit(); 
    }); 
}); 

app.listen(4000, function(){ 
    console.log('Server On!!!'); 
}); 

Должен ли я использовать другой экспресс, чтобы отобразить страницу входа? или что мне здесь делать? Я на самом деле новичок в node.js.

Может кто-нибудь, пожалуйста, помогите мне здесь?

Спасибо ..

EDIT: Мой весь код app.js

var express = require('express'); 
var app = express(); 

//Added for connecting login session 
var http = require('http'); 
var server = http.createServer(app); 
var path = require('path'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var session = require('express-session'); 
var flash = require('connect-flash'); 
var async = require('async'); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var methodOverride = require('method-override'); 

//connecting database 
mongoose.connect("private mongoDB address"); 
var db = mongoose.connection; 
db.once("open",function() { 
    console.log("DB connected!"); 
}); 
db.on("error",function (err) { 
    console.log("DB ERROR :", err); 
}); 

var bcrypt = require("bcrypt-nodejs"); 
var userSchema = mongoose.Schema({ 
    email: {type:String, required:true, unique:true}, 
    password: {type:String, required:true}, 
    createdAt: {type:Date, default:Date.now} 
}); 
userSchema.pre("save", function (next){ 
    var user = this; 
    if(!user.isModified("password")){ 
    return next(); 
    } else { 
    user.password = bcrypt.hashSync(user.password); 
    return next(); 
    } 
}); 
userSchema.methods.authenticate = function (password) { 
    var user = this; 
    return bcrypt.compareSync(password,user.password); 
}; 

var User = mongoose.model('user',userSchema); 

app.set("view engine", 'ejs'); 
app.use(express.static(path.join(__dirname, 'public'))); 
//setting middleware for login 
app.use(cookieParser()); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended:true})); 
app.use(methodOverride("_method")); 
app.use(flash()); 

app.use(session({secret:'MySecret', resave: true, saveUninitialized: true})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    //console.log('serializeUser()', user); 
    done(null, user.id); 
}); 
passport.deserializeUser(function(id, done) { 
    //console.log('deserializeUser()', user); 
    User.findById(id, function(err, user) { 
    done(err, user); 
    }); 
}); 
var global_username = ''; 
var LocalStrategy = require('passport-local').Strategy; 
passport.use('local-login', 
    new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     User.findOne({ 'email' : email }, function(err, user) { 
     if (err) return done(err); 
     if (!user){ 
      req.flash("email", req.body.email); 
      return done(null, false, req.flash('loginError', 'No user found.')); 
     } 
     if (!user.authenticate(password)){ 
      req.flash("email", req.body.email); 
      return done(null, false, req.flash('loginError', 'Password does not Match.')); 
     } 
     var email_address = req.body.email; 
     var username = email_address.substring(0, email_address.lastIndexOf("@")); 
     global_username = username; 
     return done(null, user); 
     }); 
    } 
) 
); 
//set home routes 
app.get('*', loggedInCheck); ------------------>This is the code with loggedInCheck function. I created another one instead of isLoggedIn function 
app.get('/login', function (req,res) { 
    res.render('login/login',{email:req.flash("email")[0], loginError:req.flash('loginError')}); 
}); 

app.post('/login', 
    function (req,res,next){ 
    next(); 
    }, passport.authenticate('local-login', { 
    successRedirect : '/posts', 
    failureRedirect : '/login', 
    failureFlash : true 
    }) 
); 


app.get('/logout', function(req, res) { 
    req.logout(); 
    res.redirect('/login'); 
}); 
// set user routes 
app.get('/users/new', function(req,res){ 
    res.render('users/new', { 
          formData: req.flash('formData')[0], 
          emailError: req.flash('emailError')[0], 
          passwordError: req.flash('passwordError')[0] 
          } 
); 
}); // new 
app.post('/users', checkUserRegValidation, function(req,res,next){ 
    User.create(req.body.user, function (err,user) { 
    if(err) return res.json({success:false, message:err}); 
    res.redirect('/login'); 
    }); 
}); // create 

app.get('/posts', isLoggedIn, function(req, res){ 
    res.redirect('/status.html?channel=' + global_username); 
}); 

//functions 
function isLoggedIn(req, res, next) { 
    if (req.isAuthenticated()){ 
    console.log("Authenticated"); 
    console.log("Accessing to status.html"); 
    return next(); 

    }else{ 
    console.log("Unauthorized Attempt"); 
    res.redirect('/login'); 

    } 
} 

function loggedInCheck(req, res, next) { 
    if (req.isAuthenticated()){ 
    res.redirect('/status.html?channel=' + global_username); 

    }else{ 
    console.log("Unauthorized Attempt"); 
    res.redirect('/login'); 

    } 
} 


server.listen(5000); 

ответ

1

В экспресс, порядок вопросов звонков.

В вашем случае вызов app.use (express.static... выполняется до app.get ('/'..., поэтому он имеет более высокий приоритет. И так как express.static заканчивает цепь промежуточного программного обеспечения, он никогда не назовет вашего app.get.

Одним из возможных решений было бы разместить ваш app.get выше app.use (express.static.

Но если вы сделаете это, вы никогда не сможете показать свой index.html. Вы можете добавить условие, чтобы выбрать, перенаправляете ли вы на /login или звоните next(), чтобы продолжить цепочку промежуточного программного обеспечения.

Редактировать

После принятия более глубокий взгляд на ваш код, вы, кажется, есть промежуточное программное обеспечение isLoggedIn делает правильную логику.

Вы можете сохранить порядок без изменений и промежуточных программного сделать app.get('*', isLoggedIn);

Это будет вызывать промежуточное программное обеспечение для любого GET запроса.

+0

@Ninetaindedo Благодарим вас за ответ. Он не работает, хотя .. hm .. Могу ли я сделать еще одну переменную express()? и попробовать? это будет хорошо? – paulc1111

+0

Нет необходимости делать такую ​​вещь. Как это не работает? Что вы сделали, и попробовали поместить некоторый журнал в функцию 'app.get ('/''. – Telokis

+0

@Ninetaindedo I put 'app.use (express.static (путь.join (__ dirname,' public '))) , между app.get ('/ login', function и app.post ('/ login', function и после ввода правильного идентификатора входа и пароля, он остается на странице входа ..: '( – paulc1111

0

Привет, я разложил файл app.js на несколько частей, чтобы изолировать маршрутизатор, файлы приведены ниже.

app.js

var express = require('./express'), 
mongoose = require('./mongoose'), 
passport = require('./passport'); 

var db = mongoose(); 
var app = express(); 
var passport = passport(); 

app.listen(3000, function() { 
    console.log('Server running on port: ' + 3000); 
}); 

экспресс.JS

var io = require('socket.io'); 
var express = require('express'); 
var app = express(); 
var redis = require('redis'); 
var sys = require('util'); 
var fs = require('fs'); 
//Added for connecting login session 
var http = require('http'); 
var server = http.createServer(app); 
var path = require('path'); 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var session = require('express-session'); 
var flash = require('connect-flash'); 
var async = require('async'); 
var bodyParser = require('body-parser'); 
var methodOverride = require('method-override'); 

module.exports = function() { 
io = io.listen(server); 

app.set("view engine", 'ejs'); 


app.use(express.static(path.join(__dirname, 'public'))); 

//setting middleware for login 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({extended: true})); 
app.use(methodOverride("_method")); 
app.use(flash()); 

app.use(session({secret: 'MySecret', resave: true, saveUninitialized: true})); 
app.use(passport.initialize()); 
app.use(passport.session()); 

require('./passport'); 
require('./router')(app); 

io.sockets.addListener('connection', function (socket) { 
    console.log("connceted : " + socket.id); 

    var subscriber = redis.createClient(6379, 'localhost'); 
    subscriber.psubscribe("*"); 
    subscriber.on("pmessage", function (pattern, channel, message) { 
     //console.log(message); 
     socket.emit(channel, message); 
    }); 

    socket.on('disconnect', function() { 
     console.log("disconnceted : " + socket.id); 
     subscriber.quit(); 
    }); 

    socket.on('close', function() { 
     console.log("close"); 
     subscriber.quit(); 
    }); 
}); 

return app; 
}; 

mongoose.js

var mongoose = require('mongoose'); 

module.exports = function() { 
var db = mongoose.connect("mongodb://localhost/stacktest"); 

require('./model'); 

return db; 
}; 

model.js

var mongoose = require('mongoose'); 
var bcrypt = require("bcrypt-nodejs"); 

var userSchema = mongoose.Schema({ 
email: {type:String, required:true, unique:true}, 
password: {type:String, required:true}, 
createdAt: {type:Date, default:Date.now} 
}); 

userSchema.pre("save", function (next){ 
var user = this; 
if(!user.isModified("password")){ 
    return next(); 
} else { 
    user.password = bcrypt.hashSync(user.password); 
    return next(); 
} 
}); 

userSchema.methods.authenticate = function (password) { 
var user = this; 
return bcrypt.compareSync(password,user.password); 
}; 

mongoose.model('Users', userSchema); 

passport.js

var passport = require('passport'), 
LocalStrategy = require('passport-local'); 

module.exports = function() { 
passport.serializeUser(function (user, done) { 
    done(null, user.id); 
    }); 
passport.deserializeUser(function (id, done) { 
    User.findById(id, function (err, user) { 
     done(err, user); 
    }); 
}); 

var LocalStrategy = require('passport-local').Strategy; 
passport.use('local-login', 
    new LocalStrategy({ 
      usernameField: 'email', 
      passwordField: 'password', 
      passReqToCallback: true 
     }, 
     function (req, email, password, done) { 
      User.findOne({'email': email}, function (err, user) { 
       if (err) return done(err); 

       if (!user) { 
        req.flash("email", req.body.email); 
        return done(null, false, req.flash('loginError', 'No user found.')); 
       } 
       if (!user.authenticate(password)) { 
        req.flash("email", req.body.email); 
        return done(null, false, req.flash('loginError', 'Password does not Match.')); 
       } 
       return done(null, user); 
      }); 
     } 
    ) 
); 
}; 

И наконец router.js

var passport = require('./passport'); 

module.exports = function(app) { 
app.get('/', function (req, res) { 
    res.redirect('/login'); 
    //req.url = '/login'; 
    //next(); 
}); 
app.get('/login', function (req, res) { 
    res.render('login', {email: req.flash("email")[0], loginError: req.flash('loginError')}); 
}); 
app.post('/login', function (req, res, next) { 
    passport.authenticate('local-login', function (err, user, info) { 
     if (err) { 
      return next(err); 
     } 
     if (!user) { 
      return res.redirect('/login'); 
     } 
     return res.redirect('/?channel=' + req.body.email); 
    })(req, res, next); 
}); 
app.get('/logout', function (req, res) { 
    req.logout(); 
    res.redirect('/login'); 
}); 

// set user routes 
app.get('/users/new', function (req, res) { 
    res.render('users/new', { 
      formData: req.flash('formData')[0], 
      emailError: req.flash('emailError')[0], 
      passwordError: req.flash('passwordError')[0] 
     } 
    ); 
}); // new 

}; 

Я не смог найти «checkUserRegValidation», поэтому мне пришлось удалить (поскольку я думал, что это не связано непосредственно с этой ошибкой), я тогда сделал два файла ejs с простым заголовком, идентифицирующим страницу (независимо от того, страница входа в систему или индекс), и я получил ожидаемый результат (страница входа была отображена при размещении localhost: // 3000 в моем браузере). Поэтому, возможно, вы можете попытаться изолировать ваши файлы, если это поможет, извините за длинный ответ.

+0

Благодарим за ответ. :) Можете ли вы сообщить мне настройки каталога, если у вас есть время ??: ( – paulc1111

+0

Кроме того, могу ли я поместить свою функцию обработчик в express.js тоже? – paulc1111

+0

@ paulc1111 yes, вот где он должен быть размещен, все файлы находятся в корневой папке (отсюда «./» для открытия файлов), за исключением представлений, в которых у меня нет папки для входа, но просто login.ejs и index.ejs –

0

Вы хотите загрузить '/ login' перед '/index.html' Я предполагаю, что вы хотите, чтобы пользователь заходил в систему до того, как достиг своей домашней страницы. Кроме того, вместо перенаправления попробуйте RENDERING.

Перед использованием этого кода сбросьте значение isLoggedIn по умолчанию.

app.get('/', function(req, res) { 
    if(!isLoggedIn) 
     res.render('login') 
    else 
     res.redirect('/'); 
    });