我可以在网上找到有关此教程的所有教程(koa-router Documentation,tutorialspoint,cloudreports?,Next official tutorial,Next official documentation),或者都不会谈论网址屏蔽,正在重定向位置,将主体设置为字符串,不使用路由参数(:parameter
)或使用其他类型的服务器。互联网是一团糟,如果我们能在这里解决这个问题,那将是巨大的。
我目前只能使用next/link
进行页面到页面的路由屏蔽,但这当然是一个糟糕的解决方案,因为人们一直在复制网址并与他人共享网址,而无需更改{{1 }},每个人都会遇到404错误。
这是应如何设置我的网址。我希望路由前缀(server.js
)在幕后实际上是/:prefix
,之后是?prefix=prefix
,以表示我的页面文件夹中的实际页面。
例如:
/:somePage
=> mycontexturl.com/identifier/details
我不想做一个俗气的mycontexturl.com/details?id=identifier
,因为这样做的全部目的是掩盖丑陋的网址。
这是我一直在工作的ctx.redirect
(没有错误消息,它与以前没有任何不同):
server.js
以及我必须开始做的事情,没有涉及任何路由:
const Koa = require('koa');
const next = require('next');
const session = require('koa-session');
const Router = require('koa-router');
const port = parseInt(process.env.PORT, 10) || 8080;
const dev = process.env.NODE_ENV !== "production";
const app = next({dev});
const handle = app.getRequestHandler();
const router = new Router({
prefix: ':objectId'
});
app.prepare().then(() => {
const server = new Koa();
server.use(session(server));
server.use(async (ctx) => {
await handle(ctx.req, ctx.res);
ctx.respond = false;
ctx.res.statusCode = 200;
return
});
router.get('/:page', (ctx, next) => {
app.render(ctx.req, ctx.res, `/${ctx.params.page}?objectId=${ctx.params.objectId}`);
ctx.respond = false;
});
router.get('*', async ctx => {
await handler(ctx.req, ctx.res);
ctx.respond = false;
});
server.use(router.routes());
server.listen(port, () => {
console.log(`>Ready on http://localhost:${port}`);
})
});
老实说,我不确定是否可行,但是如果解决方法很简单,只需重写我的const Koa = require('koa');
const next = require('next');
const session = require('koa-session');
const port = parseInt(process.env.PORT, 10) || 8080;
const dev = process.env.NODE_ENV !== "production";
const app = next({dev});
const handle = app.getRequestHandler();
app.prepare().then(() => {
const server = new Koa();
server.use(session(server));
server.use(async (ctx) => {
await handle(ctx.req, ctx.res);
ctx.respond = false;
ctx.res.statusCode = 200;
return
});
server.listen(port, () => {
console.log(`>Ready on http://localhost:${port}`);
})
});
文件(例如ex.express)而不必更改项目中的任何其他内容,我就是也可以。
注意:我尝试通过server.js
禁用next的默认文件系统路由,但是没有运气。