0

嘿,所以当我尝试访问一个不登录就无法访问的页面时,应用程序崩溃了。我该如何避免这种情况?它崩溃的原因是当他们尝试访问该页面时,该页面会尝试加载未定义的数据。

错误是

TypeError:无法读取 null 的属性“firstName”。

这在我尝试访问 UserProfile 页面后加载。

我不确定在哪里放置一个人不能访问除主页、登录、注册页面之外的任何其他页面,除非他们已经登录?

app.js 文件:

var express = require('express')
  , app = express()
  , dbUserModel = require('./models/user')
  , db = require('./db')
  , pass = require('./config/passport')
  , passport = require('passport')
  , routes = require('./routes/index')
  , user = require('./routes/user')
  , path = require('path')
  , http = require('http')
  , connect = require('connect')
  , mongoose = require('mongoose')
  , mongoConnect = mongoose.connect('mongodb://localhost/test5');

// all environments

app.configure(function(){
    app.set('port', process.env.PORT || 3000);
    app.set('views', __dirname + '/views');
    app.set('view engine', 'jade');


    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.bodyParser());
  app.use(express.cookieParser('sabkdasdkjhakhfkahf7232ujdijaw9jok&^&^@88'));
  //app.use(express.cookieSession());
  app.use(express.methodOverride());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    app.use(express.static(path.join(__dirname, 'public')));    
});
  app.get('/', routes.index);
  app.get('/register', user.register);
  app.post('/register', user.registerPost);
  app.get('/login', user.login);
  app.post('/login', user.loginPost);
  app.get('/userProfile', user.userProfile);
  //app.get('/contacts', user.contacts);
  app.get('/editUserProfile', user.editUserProfile);
  app.post('/editUserProfile', user.editUserProfilePost);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
  console.log('Users: ' + db.collections.users);
});
4

1 回答 1

2

直接的方法是将中间件添加到用户必须登录的所有路由中。在该中间件中,您可以决定如果用户未登录该做什么。根据页面的类型,您可以呈现一般页面或重定向到登录页面。

中间件,我们称之为它user.mustBeLoggedIn,看起来像这样:

exports.mustBeLoggedIn = function (req, res, next) {
  // Assuming passport always sets req.user when logged in
  if(!req.user) {
    // You could add a redirect query param if you want to be nice and redirect
    // the user back to this page
    res.writeHead(302, { 'Location': '/login' });
    return res.end();
  }

  // If the user is logged in just let the next middleware in the middleware chain handle the request
  next();
};

然后,在需要用户登录的任何路由之前声明该中间件的位置:

app.get('/login', user.login);
app.post('/login', user.loginPost);
app.get('/userProfile', user.mustBeLoggedIn, user.userProfile);

如果您还将所有需要登录的路由放在一个目录下,您可以通过将中间件放在一个规则中来进一步简化代码,例如 all /user/*

app.get('/user/*', user.mustBeLoggedIn);
app.get('/user/profile', user.userProfile);
app.get('/user/editProfile', user.editUserProfile);
app.get('/user/etc', user.etc);

这种技术可以进一步增强,例如需要不同的用户级别,但这超出了这个答案的范围。

于 2013-07-13T20:43:31.157 回答