Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在node.js中使用express.static显示index.html之前显示登录页面_Node.js_Express_Static - Fatal编程技术网

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

如何在node.js中使用express.static显示index.html之前显示登录页面,node.js,express,static,Node.js,Express,Static,我正在使用app.use(express.static(path.join('public'))在Node.js中显示index.html之前显示登录页面 但是,它不会在index.html之前显示登录页面。。。 我试图使用app.get('/',function(req,res){res.redirect('/login');})但它甚至没有通过应用程序。get并且在连接到localhost:4000时不会重定向 我的目录设置如下所示 myapp node_modules public

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

但是,它不会在index.html之前显示登录页面。。。 我试图使用app.get('/',function(req,res){res.redirect('/login');})但它甚至没有通过
应用程序。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!!!');
});
我应该使用另一个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

一种可能的解决方案是将你的
应用程序.get
放在
应用程序.use(express.static
上方

但是,如果您这样做,您将永远无法显示您的
index.html
。您可以添加一个条件来选择是重定向到
/login
还是调用
next()
以继续中间件链

编辑

在深入研究代码之后,您似乎有了一个中间件
isLoggedIn
来执行正确的逻辑

您可以保持中间件的顺序不变,并执行
app.get('*',isLoggedIn);


这将为任何
获取
请求调用您的中间件。

Hie,为了隔离路由器,我将您的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;
};
猫鼬

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 在我的浏览器中)。因此,如果有帮助,也许您可以尝试隔离您的文件,很抱歉回答太长。

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

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

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

@NinetIndedo谢谢你回复我。但是它不起作用..嗯..我可以再做一个express()变量吗?然后再试一次吗?可以吗?没有必要做这样的事情。它怎么不起作用呢?你做了什么?你有没有尝试在
app.get('/'
函数中添加一些日志。@NinetIndedo I put'app.use(express.static)@(path.join(uu dirname,'public'));介于app.get('/login',function和app.post('/login',function)之间,在输入正确的登录id和密码后,它将停留在登录页上。:(让我编辑我的答案,我在您的代码中发现了一些应该对您有帮助的内容better@Ninetaindedo非常感谢你帮了我的忙!我等着……)谢谢您回复答案。:)如果您有时间,您能告诉我目录设置吗?“:”(另外,我可以将我的函数处理程序也放在express.js中吗?@palc1111是的,它应该放在那里,所有文件都在根文件夹中(因此可以使用“/”打开文件),除了没有登录文件夹,只有login.ejs和index.ejs的视图