Koa-router 路由 url 不存在

Koa-router route urls that don't exist

我不敢相信没有简单的答案可以做到这一点。 我想重定向比方说;

www.example.com/this-url-does-not-exist

www.example.com/

一定有办法,所有的nodejs网站用koajs都不会崩溃?这是我的路由器(我将 koa 与 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: *";
    });

并且不要告诉我使用正则表达式,我一直在尝试并使用它们,这意味着在添加 url 等时手动更新表达式。这不是我一直在寻找的,而且它不是'无法正常工作,因为 javascript 不支持负面回顾。

詹姆斯·摩尔的回答是正确的;不要听我的!

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 未能通知 .get 依赖于它们在代码中添加的 order。所以把它放在正则表达式 /(|^$)/ 的最后。

然而,这在使用 koa-mount 挂载其他路由器时会产生干扰。

如果您不喜欢正则表达式,请执行以下操作:

var koa   = require('koa'),
    router = require('koa-router')(),
    app   = koa();


router.get('/path1', function *(){
    this.body = 'Path1 response';
});

router.get('/path2', function *(){
    this.body = 'Path2 response';
});

app.use(router.routes())
app.use(router.allowedMethods());

// catch all middleware, only land here
// if no other routing rules match
// make sure it is added after everything else
app.use(function *(){
  this.body = 'Invalid URL!!!';
  // or redirect etc
  // this.redirect('/someotherspot');
});

app.listen(3000);

尽管 James Moore 的答案很有效,但在 koa v3 中将删除对生成器的支持。 为了将“旧”生成器中间件转换为新的 async-await 版本:

app.use(async (ctx, next) => {
    await next();
    ctx.redirect("/someotherurl");
});

我已经使用 @koa/router 实现了路由,并且我将路由放在一个单独的文件中。无论如何,我只是在 app.listen() 之前添加了上述功能。以下是我处理重定向的方式:

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}`);
});

官方文档在这里:https://github.com/koajs/koa/blob/master/docs/migration.md#upgrading-middleware