javascript - 如果有人尝试在未登录的情况下访问页面,如何避免崩溃?

标签 javascript node.js mongodb

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

错误是

类型错误:无法读取 null 的属性“firstName”。

在我尝试访问用户配置文件页面后,此内容会加载。

我不知道该把一个人放在哪里,除非他们已经登录,否则基本上无法访问除主页、登录、注册页面之外的任何其他页面?

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);
});

最佳答案

最简单的方法是向用户必须登录的所有路由添加一个中间件。在该中间件中,您可以决定用户未登录时要执行的操作。根据页面的类型,您可以渲染一般页面或重定向到登录页面。

中间件,我们称之为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);

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

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

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

关于javascript - 如果有人尝试在未登录的情况下访问页面,如何避免崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17633276/

相关文章:

node.js - 类型错误 : callback is not a function in nodejs

node.js - Mongoose 中的子文档和嵌套对象有什么区别?

node.js - 如何在 Mongoose 模式中使用项目的值

javascript - Node - req.body 有值但返回未定义

javascript - AssertionError [ERR_ASSERTION] : handler (func) is required in mongodb

mongodb - 无法启动 mongo 数据库

javascript - 在 Chart.js 中将 Y 轴值从实数更改为整数

javascript - 在 React 中渲染数组中的特定元素

javascript - js检测flash播放器版本的方法

javascript - CSS 不适用于 Flask