用例
我有一些前端的自定义表单,需要一个已登录的用户。 因此我使用keystone.js自己的“requireUser”中间件。 用户登录后,要访问该站点,默认行为是在“/ keystone”显示管理UI - 但是我想重定向回到上一个前端页面,因此用户可以开始填写表单。 / p>
什么有用
在keystone.js中,在名称完全相同的文件中,您可以设置
keystone.set('signin redirect', '/');
在登录后重定向到主页。
我需要什么
但是,我需要的是将url设置为动态重定向,但是当我这样做时,永远不会调用该函数:
keystone.set('signin redirect', function(req, res){
var url = req.session.returnTo || '/';
res.redirect(url);
});
req.session.returnTo参数在前面提到的“middleware.js”文件中设置,方法是从前端页面获取req.path属性:
exports.requireUser = function (req, res, next) {
if (!req.user) {
req.flash('error', 'Please sign in to access this page.');
req.session.returnTo = req.path;
res.redirect('/keystone/signin');
} else {
next();
}
};
我的临时解决方法
在keystone / admin / server / routes / signin.js中我扩展了locals对象的redirect属性
redirect: keystone.get('signin redirect'),
到
redirect: (typeof keystone.get('signin redirect') === 'string') ?
keystone.get('signin redirect') : keystone.get('signin redirect')(req, res),
我知道这不是一个理想的解决方案,但由于我还在学习keystone.js,你知道更好的处理方法吗?
注意:设置“注销重定向”键(同时将字符串或函数作为第二个参数)时,相同的重定向策略也可以工作,所以我想这必须是忘记实现的东西吗?
由于
答案 0 :(得分:1)
@hajn 关于Keystone项目的#1489问题,目前还没有理想的解决方案。文档没有正确地提供函数参数(我认为这是一个问题)。所以,我在3天前重新开启了这个问题。
答案 1 :(得分:0)
更改route / middleware.js替换方法exports.requireUser,如下所示:
/**
Prevents people from accessing protected pages when they're not signed in
*/
exports.requireUser = function (req, res, next) {
if (!req.user) {
req.flash('error', 'Please sign in to access this page.');
if(req.url) {
res.redirect('/keystone/signin?from='+req.url);
} else {
res.redirect('/keystone/signin');
}
} else {
next();
}
};
从指向/ keystone / signin的任何URL,在查询字符串中包含from参数,如下所示:
<a href="/keystone/signin?from=/">Log in</a>
或
<a href="/keystone/signin?from=/my/page/that/requires/login">Log in</a>