Каждый учебник, который я могу найти об этом в Интернете ( Документация koa-router , tutorialspoint , cloudreports? , Следующий официальный учебник , Следующая официальная документация ) либо не говорите о маскировании URL, перенаправляйте места, устанавливайте тело в строку, не используйте параметры маршрута (:parameter
), либо используйте сервер другого типа,Интернет - это большой беспорядок, и было бы здорово, если бы мы могли просто уладить это прямо здесь.
В настоящее время я могу выполнять маскирование маршрутов между страницами только с next/link
, но, конечно, это ужаснорешение, потому что люди копируют URL-адреса и постоянно делятся ими с другими без внесения изменений в server.js
, каждый получит 404 ошибки.
Вот как должны быть настроены мои URL-адреса.Я хочу, чтобы префикс маршрута (/:prefix
) фактически находился за кадром ?prefix=prefix
, а после него /:somePage
представлял фактическую страницу в папке моих страниц.
Например:
mycontexturl.com/identifier/details
=> mycontexturl.com/details?id=identifier
Я не хочу сделать глупость ctx.redirect
, потому что весь смысл этого в том, чтобы замаскировать уродливый URL.
Вот мой нерабочий 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}`);
})
});
Я, честно говоря, не уверен, возможно ли это, но если это исправить так же просто, как просто переписать мой server.js
файл (с помощью экспресс для ex.) без необходимости что-либо менять в моем проекте, с этим у меня тоже все в порядке.
Примечание: я попытался отключить маршрутизацию файловой системы по умолчанию следующего через next.config.js
, но безуспешно.