如何在node.js中使用express.static显示index.html之前显示登录页面

时间:2017-02-16 03:57:29

标签: node.js express static

我在使用app.use(express.static(path.join(__dirname,'public')));显示登录页面之前在Node.js中显示index.html。

然而,它并没有在index.html之前显示登录页面... 我尝试使用app.get('/', function (req,res) {res.redirect('/login');});但它甚至没有通过app.get并且在连接到localhost时没有重定向: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中的新手。

有人可以帮帮我吗?

谢谢..

编辑:我的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);

3 个答案:

答案 0 :(得分:1)

在Express中,通话顺序很重要。

在您的情况下,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请求。

答案 1 :(得分: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);
});

express.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时,呈现了登录页面。所以也许你可以尝试隔离你的文件,如果它有帮助,抱歉很长的答案。

答案 2 :(得分:0)

您想在'/index.html'之前加载'/ login'我假设您希望用户在到达主页之前登录。 此外,不要重定向,请尝试RENDERING。

在使用此代码之前,请将isLoggedIn重置为默认值。

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