服务器上的路由弄乱了客户端的路由?

Posted

技术标签:

【中文标题】服务器上的路由弄乱了客户端的路由?【英文标题】:Routing on the server messes up routing on the client side? 【发布时间】:2014-05-04 03:55:51 【问题描述】:

使用 passport.js 在用户登录之前我不需要任何客户端 javascript

在我的服务器端,我有一个处理一些登录逻辑的路由器。所以当用户成功登录后,我将用户路由到/profile路由。

这让我很困惑,因为 express 正在处理整个框架。 /profile 路由渲染了我的配置文件模板res.render('profile', user : req.user ); 并很好地将用户的服务器模型传递到模板中,很酷的东西!

但这就是让我着迷的原因,如果我的应用程序现在位于 /profile 上,我的目录中不存在一个路径,而我在这里定义了我的目录 app.use('/', express.static(path.join(__dirname, 'public')));,这会导致架构错误。

因为有时我的 js css 会出现 404 错误。我必须在我的客户端骨干路由器上像这样/routes#chat 路由。

我的问题

那么在用户成功后以某种方式重定向回localhost:3000 并现在销毁登录视图并呈现用户配置文件视图是否是个好主意?有人可以告诉我如何进行这样的路由吗?我有一个大概的想法,但当我认为服务器端需要与客户端进行通信时,我不太确定该怎么做?

如果以上是一个坏主意,有人可以给我建议如何更好地看待这个吗?

编辑:路线

app.get('/', function(req, res) 
    res.render('index'); 
);

app.get('/login', function(req, res) 
    res.render('login',  message: req.flash('loginMessage') ); 
);

app.get('/profile', isLoggedIn, function(req, res) 
    res.render('profile',  user : req.user );
    res.redirect('/');
    io.sockets.on('connection', function (socket) 
        socket.userName = req.user.local.email;
        users[socket.userName] = socket;
        console.log(Object.keys(users))
    );
);

【问题讨论】:

基础/服务器路由先检查isLogin,如果真渲染profile,假渲染/直接到/login。登录后重定向到/ 是的,我试过了,所以我让用户保存在会话中。但是当重定向到/ 时,我如何将用户属性传递给模板。如果我重定向到/,它将使用包含两个按钮的 index.handlebars,登录或注册。 我的意思是你的 index.handlerbar 需要是个人资料页面。你当前的索引变成 login.handlerbar。 哦,有道理我没有那样想。谢谢,让我试着改变一下。 好的,我明白你在说什么。我的问题是,如果我设置了默认路由,那么每当我返回该路由时,它都会运行初始路由。因此,通过路由回/,它会运行任何设置。 【参考方案1】:

使用 session 记住登录或使用一些自定义函数来查询登录状态。

app.get('/', function(req, res) 

    if (req.session.isLogin) 
        res.render('profile',  user : req.user );
        // put other code here
    
    else
        res.redirect('/login'); 
);

app.get('/login', function(req, res) 
    res.render('login',  message: req.flash('loginMessage') ); 
);

【讨论】:

哦,太好了,我是路由和所有这些东西的新手。我很欣赏这个例子。很高兴你回应我正在摆弄我的理智:) 我的路由中间件看起来像这样function isLoggedIn(req, res, next) if (req.isAuthenticated()) return next(); res.redirect('/'); req.session.isLoggedIn 似乎返回未定义? 所以由于我使用的是passport.js,看来我需要使用req.user 它可以工作,不确定它是否安全?但是***.com/questions/18739725/… if (req.user) 一个好的解决方案,而不是 if (req.session.isLogin) 声音关闭和生病肯定会给你一个绿色检查。感谢您的洞察力.... 您是否使用 passport.js 进行身份验证?或者我从任何其他问题中弄错了。

以上是关于服务器上的路由弄乱了客户端的路由?的主要内容,如果未能解决你的问题,请参考以下文章

iPad上的方向变化弄乱了触摸

使用 Google App Engine 作为后端的 Google Cloud Load Balancer 上的 GeoDNS 路由

zuul如何路由到上游服务器

PageSpeed 模块弄乱了图像的比例

NSJSONSerialization 弄乱了结果 NSDictionary

怎么用SSH登陆OpenWrt,服务端和客户端的设置方法