如何使用Koa,Next和Koa-Router在server.js中进行路由/ URL屏蔽

时间:2019-06-01 14:42:06

标签: node.js server routes next.js koa

我可以在网上找到有关此教程的所有教程(koa-router Documentationtutorialspointcloudreports?Next official tutorialNext 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的默认文件系统路由,但是没有运气。

0 个答案:

没有答案