2017-01-06 5 views
0

Ich habe einen Koa 2 Server.koa-static zur nächsten Middleware gehen

Der folgende Code sind meine Middle:

// parse body 
app.use(bodyParser()) 

// serve static 
app.use(serve(path.join(__dirname, '/public'))) 

// routes 
app.use(routes) 

// error middleware 
app.use(async ctx => ctx.throw(500)) 

Alles funktioniert gut, aber mein Problem ist, dass, wenn ich zu gehen localhost: 8000, wo mein Server lebt, in der Konsole ich folgende Fehlermeldung angezeigt:

InternalServerError: Internal Server Error at Object.throw (/Users/work/Desktop/server/node_modules/koa/lib/context.js:91:23)

ich den Verdacht, dass nach statisch, die App auf die nächste Middleware wird, die die Fehler-Middleware ist.

PS. Ich verwende app.use(async ctx => ctx.throw(500)), um next() aufzurufen, wenn ich Fehler auf den anderen Routen bekomme.

Kann jemand das beheben?

Danke!

+0

haben Sie immer noch das Problem, wenn Sie die Fehler-Middleware auf Kommentar? – saadq

+0

nein, aber ich brauche, dass – Anderson

+0

Ok, nur um sicher zu machen, das ist, wo das Problem herkam. Könnten Sie Ihren Anteil ' routes' code? – saadq

Antwort

0

I'm suspecting that after static, the app is going to the next middleware, which is the error middleware.

koa-static überträgt die Steuerung an die nächste Middleware von Entwurf. Ihre routes Middleware auch await zur nächsten Middleware. Sie erhalten also einen Fehler.

Does anyone know how to fix this?

Es ist schwer zu sagen, was Sie in erster Linie erreichen werden. 500 manuell einzustellen ist wahrscheinlich eine falsche Idee. Es sollte 404 wie:

// 404 middleware 
app.use(async ({response}, next) => { 
    if (!this.body) { 
    response.status = 404 
    response.body = "Not Found" // or use template 
    } 
    await next() // send control flow back (upstream) 
}) 

Für SPA (ohne SSR) möchten Sie wahrscheinlich diese Catch-All-Route, um APP-Layout stattdessen zu senden. Und bewegen, dass 404 Middleware an den Anfang der Datei (wo sie die Kontrolle auf der zweiten „sprudelnden“ Phase stattfinden wird.

Stellen Sie sicher, geprüft this

0

Verwendung wie Sie eine Middleware hinzufügen Ihren benutzerdefinierten Fehler behandeln richtig ...

// serve static 
app.use(serve(path.join(__dirname, '/public'))) 
// error middleware 
app.use(async(ctx, next) => { 
    try { 
     await next(); 
    } catch (e) { 
     console.log(e.message); 
     ctx.body = e.message 
    } finally {} 
}) 
// routes 
app.use(router.routes()).use(router.allowedMethods()); 

router.get('/a', ctx => { 
    try { 
     ctx.body = "sadsa" 
    } catch (e) { 
     ctx.body = e 
     console.log(e); 
    } finally {} 
}); 
app.use(ctx => ctx.throw(500)) 
app.listen(7000) 
+0

würde es Ihnen etwas ausmachen zu erklären, was Sie sind anders als OP und warum. Es gibt immer einen lehrenden Moment und wird anderen helfen, die auf dieses Problem stoßen, das vielleicht subtil anders ist. –

Verwandte Themen