如何在Koa 2中处理404

How to handle a 404 in Koa 2?

本文关键字:处理 Koa      更新时间:2023-09-26

我有一个404.jade文件,每当出现无效的GET请求时,我都要呈现该文件。

这是我当前的代码:

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

路由/索引.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

路由/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

如何处理任何类型的无效GET请求,并在发生时以某种方式使用await ctx.render('404')

您可以在app.js文件中添加自定义middleware

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

ctx.response.status的默认值为404

application.js第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;
}

如果你打电话:

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

状态代码将自动更改
所以我们可以使用这个:

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

这里的警告是,如果您使用koa-router,请确保以上函数是用app.use(app=new Koa())调用的,而不是用router.use 调用的