我是靠谱客的博主 尊敬手机,这篇文章主要介绍koa中间件异步操作使用fs.readFile正常运行后,前端收到404错误,现在分享给大家,希望可以做个参考。

场景

  • 在使用koa2编写接口时,在中间件中使用了fs.readFile函数,在它的回调中进行了ctx的返回设置,但是前端获取该接口返回却是404(已确定接口逻辑没有错误且正确执行了)

  • 代码:

  • 复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    router.get('/:folder/:date/:file', async ctx => { const { folder, date, file } = ctx.params; const path = `static/${folder}/${date}/${file}`; await fs.readFile(path,function(err,data) => { if(err) { ctx.status = 404; ctx.body = { data: { msg: '文件不存在' }, code: 404 }; } else { console.log(111); // 打印调试 ctx.status = 200; console.log(ctx.status); // 打印调试 ctx.body = { data: { article: data.toString(), msg: '查询成功' }, code: 200 }; } }) });
  • 描述:请求接口后,上述程序的打印结果是111404

  • 思考:上网查询别人返回404的问题基本都是中间件含异步操作但没有使用async/await处理,与我的问题无关

  • 解决:

    • 方法一:将fs.readFile改为同步读取fs.readFileSync

    • 复制代码
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      const data = fs.readFileSync(path) if(!data) { console.log(111); // 打印调试 ctx.status = 200; console.log(ctx.status); // 打印调试 ctx.body = { data: { article: data.toString(), msg: '查询成功' }, code: 200 }; } else { ctx.status = 404; ctx.body = { data: { msg: '文件不存在' }, code: 404 }; }
    • 方法二:用Promise封装fs.readFile函数

    • 复制代码
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      // 封装 function pReadFile (path) { return new Promise(function (resolve, reject) { fs.readFile(path, function (err, data) { if (err) { reject(err); } else { resolve(data); } }); }); } // 使用 await pReadFile(path).then(data => { ctx.status = 200; ctx.body = { data: { article: data.toString(), msg: '查询成功' }, code: 200 }; }).catch(err => { ctx.status = 404; ctx.body = { data: { msg: '文件不存在' }, code: 404 }; });
    • 总结:查询资料发现koa的中间件对异步操作好像是返回一个Promise对象处理的,而原生的fs.readFile并不返回一个Promise对象,将其用Promise封装后就可正常运行

最后

以上就是尊敬手机最近收集整理的关于koa中间件异步操作使用fs.readFile正常运行后,前端收到404错误的全部内容,更多相关koa中间件异步操作使用fs内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部