-
-
Notifications
You must be signed in to change notification settings - Fork 104
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
redirect route? authorized routes #10
Comments
@rstormsf can you give me full example? |
A redirect example would be useful. |
This is roughly what I have. I'm not satisfied but it works for now. router.js
app.js
|
@mfrye what is ReactTapEvent() ? |
@koistya is there any possibility now to redirect to different route? I see that post is quite old and universal-router API has changed since then? |
Admin route + redirect example: client.jsimport UniversalRouter from 'universal-router'
import { createHistory } from 'history'
import routes from './routes'
history = useQueries(createBrowserHistory())
history.listen(onLocationChange)
history.replace(history.getCurrentLocation()); // initial render
async function onLocationChange(location) {
try {
const routeActionResult = await UniversalRouter.resolve(routes, {
path: location.pathname,
store: { isAdmin: false },
redirect(to) {
const error = new Error(`Redirecting to "${to}"...`)
error.status = 301
error.path = to
throw error
}
})
syncOrAsyncClientSideRenderFn(routeActionResult)
} catch (error) {
if (error.status === 301) {
history.replace(error.path || '')
return
}
// log or display other errors here
}
} server.jsimport express from 'express'
import UniversalRouter from 'universal-router'
import routes from './routes'
const server = express()
const port = process.env.PORT || 3000
app.get('*', async (req, res, next) => {
try {
const routeActionResult = await UniversalRouter.resolve(routes, {
path: req.path,
store: { isAdmin: false },
redirect(to) {
const error = new Error(`Redirecting to "${to}"...`)
error.status = 301
error.path = to
throw error
}
})
const html = syncOrAsyncServerSideRenderFn(routeActionResult)
res.status(200).send(html)
} catch(error) {
if (error.status === 301) {
req.redirect(status.path || '/')
return
}
next(error)
}
})
server.listen(port, () => {
console.log(`Node.js app is running at http://localhost:${port}/`)
}) routes.jsexport default [
{
path: '/',
action() {
return 'main page'
}
},
{
path: '/login',
action() {
return 'login page'
}
},
{
path: '/admin',
action({ store, redirect }) {
if (store.isAdmin) return 'admin page'
return redirect('/login') // or return undefined to render 404 instead
}
}
] |
@frenzzy would be great to see such example in documentation :) |
@frenzzy It is needed do redirect through exception? |
@langpavel nope, it is just the easiest way to stop executing all routing code. In other way you need to handle redirect in several places (for example in each root/parent route) or add implementation to the core of router. But I do not see anything wrong with the exception approach, because we still need to handle errors such as 404 or 500. |
@frenzzy It seems that there is already a try catch block for route action in resolve function which take precedence over the try catch block above. For now, I set a boolean for redirection when required and use that to redirect later. |
How would you do this ? to make sure that the url is authorized
**Update:
Answer from @koistya on Gitter:
--- Want to back this issue? **[Post a bounty on it!](https://www.bountysource.com/issues/26405822-redirect-route-authorized-routes?utm_campaign=plugin&utm_content=tracker%2F18115217&utm_medium=issues&utm_source=github)** We accept bounties via [Bountysource](https://www.bountysource.com/?utm_campaign=plugin&utm_content=tracker%2F18115217&utm_medium=issues&utm_source=github).The text was updated successfully, but these errors were encountered: