koa如何处理响应错误?

see311
  • 384

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' }
回复
阅读 2k
1 个回答

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);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏