2016-08-09 3 views
2

Im Express können wir einfach folgende Codes verwenden, um mit der Anfrage umzugehen. Die Serverseite sendet index.html, wenn die Anfrage nicht vom Router bearbeitet wird.Wie Browserhistorie in Reagieren Router mit Koa verwenden

app.get('*', function (request, response){ 
    response.sendFile(path.resolve(__dirname, '../public', 'index.html')) 
}) 

Aber in koa funktioniert der folgende Code nicht. Wenn die Anfrage nicht von koa-router bearbeitet wird, wird 404 anstelle von index.html zurückgegeben.

var send = require('koa-send') 
var serve = require('koa-static') 
var router = require('koa-router') 
var koa = require('koa') 
var app = koa(); 

app.use(serve(__dirname+'/../public')); 
app.use(function *(){ 
    yield send(this, path.join(__dirname, '/../public/','index.html')); }) 
app.use(router.routes()) 

folgenden Code auch nicht funktionieren

router 
    .get('*', function*() { 
    yield send(this, __dirname +'/../public/index.html') 
    }) 
+2

Könnten Sie definieren * "nicht funktionieren" *? Wirft es Fehler? Tut es nichts? Gibt es Bilder von Rick Astley zurück? – ivarni

+0

@ivarni Sorry für das Fehlen der klaren Informationen. Ich habe die Frage gerade aktualisiert. – fiona

Antwort

0

Im Wesentlichen, was Sie erreichen möchten, ist Server-Rendering. Sie müssen die Routenkonfiguration mit der Übereinstimmung & RouterContext schreiben. react-router hat detaillierte Dokumentation dafür.

Server Rendering in react-router

Bei koa kann es grob auf diese Weise durchgeführt werden.

import router from 'koa-router' 
import { match, RouterContext } from 'react-router' 

const koaRouter = router() 

const otherRouter =() => { 
    return new Promise((resolve, reject) => { 
    match({ routes, location }, (error, redirectLocation, renderProps) => { 
    ... 
    .. 
    . 
} 
} 

koaRouter 
    .use(otherRouter) 

Ich fand ein paar Repos online, die ziemlich anständig scheinen. Ich habe sie jedoch nicht überprüft.

breko-hub

koa-react-isomoprhic

+0

Es klingt mehr nach dem, was sie zu erreichen versuchen, ist die Verwendung der HTML5-History-API, die Sie auf keinen Fall serverseitig rendern müssen. Um jedoch mit der Seitenaktualisierung arbeiten zu können, muss jede URL dieselbe 'index.html' Datei zurückgeben. Das funktionierende Express-Beispiel ist ein deutliches Zeichen dafür. – ivarni

0
router.get('*', async function(ctx, next) { 
    var html = fs.readFileSync(path.resolve('./build/index.html')); 
    ctx.type = 'html'; 
    ctx.body = html; 
}) 

das für mich arbeitet

Verwandte Themen