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
我不敢相信没有简单的答案可以做到这一点。 我想重定向比方说;
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