es6 - koa如何处理响应错误?

查看:154
本文介绍了es6 - koa如何处理响应错误?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

app.js

const port = 3000;
const Koa = require('koa');
const Ctrl = require('koa-route');
const app = new Koa();
const FileManager = require('./module/file_manager.js');
    
app.use(Ctrl.get('/api/item_list', async (ctx) => {
    ctx.set('Cache-Control', 'no-cache');
    ctx.body = await FileManager.getItemList();
}))
    
app.listen(port);

file_manager.js

const fs = require('fs');

module.exports = {
    getItemList() {
        return new Promise((res, rej) => {
            fs.readFile('./user_info.json', 'utf-8', (err, data) => {
                err ? rej(err) : res(data);
            })
        })
    }
}

简单说就是app.js通过file_manager.js读取一个json文件,然后作为响应返回。这样写可以获得正确的响应。
我想问一下,如果需要对错误处理,比如当没有这个文件的时候,ctx.body响应主体是一个错误信息的json,ctx.status = 404,该如何写?
初学者,见谅

更改后的app.js,在响应前增加了错误处理

app.use(async (ctx, next) => {
    try{
        await next();
    }catch(e){
        console.log(e);
        ctx.body = `catch error:${e}`;
    }
})

catch到的错误如下

{ Error: ENOENT: no such file or directory, open 'E:\test\wedding_invitation\
ding_invitation\user_info.json'
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'E:\\test\\wedding_invitation\\wedding_invitation\\user_info.json' }

解决方案

koa的思路是将所有异步函数按注册顺序包裹成一个壳子:

async func0 {
    async func1{
        async func2 {
            // netsted...
        }
    }
}

所以你只要在注册router之前,先注册一个错误处理函数就可以了:

app.use(async(ctx, next) => {
  try {
    await next();
  } catch (e) {
    // TODO
  } finally {
    // TODO
  }
});

app.use(other middleware);

这篇关于es6 - koa如何处理响应错误?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆