Как выполнить маскирование маршрута / URL-адреса в server.js с помощью Koa, next и koa-router - PullRequest
0 голосов
/ 01 июня 2019

Каждый учебник, который я могу найти об этом в Интернете ( Документация 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, но безуспешно.

...