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

场景

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

  • 代码:

  • 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

    • 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函数

    • // 封装
      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内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部