2016-05-03 13 views
4

Ich habe eine 404.jade Datei, die ich rendern möchte, wenn es eine ungültige GET-Anfrage gibt.Wie behandelt man einen 404 in Koa 2?

Hier ist meine aktuellen Code:

app.js

import Koa from 'koa' 
import views from 'koa-views' 
import serve from 'koa-static' 
import rootRoutes from './routes/index' 
import userRoutes from './routes/user' 

const app = new Koa() 

app.use(views(`${__dirname}/views`, { extension: 'jade' })) 
app.use(serve(`${__dirname}/public`)) 
app.use(rootRoutes.routes()) 
app.use(userRoutes.routes()) 

app.listen(3000,() => { 
    console.log('Server running at http://localhost:3000') 
}) 

export default app 

Routen/index.js

import Router from 'koa-router' 
const router = new Router() 

router.get('/', async ctx => { 
    await ctx.render('index') 
}) 

router.get('/about', async ctx => { 
    await ctx.render('about') 
}) 

export default router 

Routen/user.js

import Router from 'koa-router' 
const router = new Router({ prefix: '/user' }) 

router.get('/:name', async ctx => { 
    const user = ctx.params.name 
    await ctx.render('user', { user }) 
}) 

export default router 

Wie kann ich jede Art von ungültigen GET-Anfrage behandeln und irgendwie verwenden , wenn es passiert?

Antwort

3

Sie können eine benutzerdefinierte middleware in Ihrer app.js Datei hinzufügen.

import Koa from 'koa' 
import views from 'koa-views' 
import serve from 'koa-static' 
import rootRoutes from './routes/index' 
import userRoutes from './routes/user' 

const app = new Koa() 

app.use(async(ctx, next) => { 
    try { 
    await next() 
    const status = ctx.status || 404 
    if (status === 404) { 
     ctx.throw(404) 
    } 
    } catch (err) { 
    ctx.status = err.status || 500 
    if (ctx.status === 404) { 
     //Your 404.jade 
     await ctx.render('404') 
    } else { 
     //other_error jade 
     await ctx.render('other_error') 
    } 
    } 
}) 

app.use(views(`${__dirname}/views`, { extension: 'jade' })) 
app.use(serve(`${__dirname}/public`)) 
app.use(rootRoutes.routes()) 
app.use(userRoutes.routes()) 

app.listen(3000,() => { 
    console.log('Server running at http://localhost:3000') 
}) 

export default app 
2

Der Standardwert von ctx.response.status 404

application.js Linie 125:

callback() { 
    const fn = compose(this.middleware); 

    if (!this.listeners('error').length) this.on('error', this.onerror); 

    const handleRequest = (req, res) => { 
     res.statusCode = 404; // defaul 
     const ctx = this.createContext(req, res); 
     const onerror = err => ctx.onerror(err); 
     const handleResponse =() => respond(ctx); 
     onFinished(res, onerror); 
     return fn(ctx).then(handleResponse).catch(onerror); 
    }; 

    return handleRequest; 
} 

und wenn Sie anrufen:

this.render('index',{}); 
this.send(); 
this.body=''; 

die Der Statuscode wird automatisch geändert.
So können wir nur verwenden:

app.use(async (ctx, next) => { 
    if(parseInt(ctx.status) === 404){ 
     ctx.status = 404 
     ctx.body = {msg:'emmmmmmm, seems 404'}; 
    } 
}) 

hier Warnung, wenn Sie koa-router verwenden, stellen Sie sicher, dass die Funktion oben mit app.use (app = new Koa()), nicht router.use

genannt wird