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

标签 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保存在公共(public)文件夹中,并且只想在此之前显示登录页面.. 有什么方法可以证明这一点吗?

这是我在 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!!!');
});

我应该使用其他 Express 来显示登录页面吗?或者我应该在这里做什么? 我实际上是 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);

最佳答案

在 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 请求调用您的中间件。

关于node.js - 如何在node.js中使用express.static显示index.html之前显示登录页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42264637/

相关文章:

node.js - map /加入 Bluebird 和 Mongoose

javascript - 从 Cheerio.js 内容中删除 unicode 字符

node.js - 回调在 connect-mongo 中不起作用

java - 从 main 方法访问带注释的类成员

c# - 是否有可能有 2 个基类已经继承自某个继承或知道第三个公共(public)类的东西?

node.js - 乘以 io.on ("connection")

javascript - createReadStream 对大文件不起作用/非常慢

javascript - 为什么我的 json 对象的 `email` 属性不会显示在我的 jade 模板中?

node.js - 如何组织我的 yarn 包

c++ - 尽管名称存在,静态链接失败