gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 18:32:59 24 4
gpt4 key购买 nike

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

错误是

类型错误:无法读取 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com