'Koa-router route urls that don't exist
I can't believe there is no easy answer to do this. I wish to redirect let's say;
www.example.com/this-url-does-not-exist
to
www.example.com/
There has to be a way, all the nodejs websites with koajs just can't crash? Heres my router (I'm using koa with koa-router):
router
.get('/', function* (next) {
this.body = "public: /";
})
.get('/about', function* (next) {
this.body = "public: /about";
})
.get('*', function* (next) { // <--- wildcard * doesn't work
this.body = "public: *";
});
And don't tell me to use regular expressions, I've been trying and with them and it means manually updating the expression when adding urls etc. which is not what I've looking for, plus it doesn't work as javascript does not support negative lookbehinds.
Solution 1:[1]
JAMES MOORES ANSWER IS CORRECT; DO NOT LISTEN TO MEH!
publicRouter
.get('/', function* (next) {
console.log('public: /');
this.body = 'public: /';
})
.get('/about', function* (next) {
console.log('public: /about');
this.body = 'public: /about';
})
.get(/(|^$)/, function* (next) { // <--- important that it is last
console.log('public: /(|^$)/');
this.body = 'public: /(|^$)/';
});
Koa-router fails to inform that .get is dependent on the order they are added in code. So putting it at the end with the regex /(|^$)/ works.
This does however interfere when using koa-mount to mount other routers.
Solution 2:[2]
Even though James Moore's answer works great, support for generators will be removed in koa v3.
In order to convert the "old" generator middleware into its new async-await version:
app.use(async (ctx, next) => {
await next();
ctx.redirect("/someotherurl");
});
I've implemented routing with @koa/router and I have the routes in a separate file. Anyway, I've simply added the above function right before app.listen(). Here's how I handled redirection:
const Koa = require("koa");
const bodyParser = require("koa-bodyparser");
const productRoutes = require("../src/routes/products.routes");
require("./db/index");
const port = process.env.PORT || 3000;
const app = new Koa();
app.use(bodyParser());
app.use(productRoutes.routes()).use(productRoutes.allowedMethods());
app.use(async (ctx, next) => {
await next();
ctx.redirect("/products");
});
app.listen(port, () => {
console.log(`Server up on port ${port}`);
});
Official docs here: https://github.com/koajs/koa/blob/master/docs/migration.md#upgrading-middleware
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | Tyler2P |
