概述
场景
-
在使用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 }; } }) });
-
描述:请求接口后,上述程序的打印结果是111和404
-
思考:上网查询别人返回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.readFile正常运行后,前端收到404错误所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复